home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / misc / eb5.zip / PACK1.PRG / EB / EB3.REP < prev    next >
Text File  |  1994-12-03  |  210KB  |  9,408 lines

  1.  
  2.  
  3.  
  4.       ════════════════════════════════════════════════════════════════
  5.                   EASY BASE PROGRAMMERS REFERENCE
  6.                             Contents
  7.       ────────────────────────────────────────────────────────────────
  8.  
  9.                   Procedure Commands            Page
  10.                   ──────────────────
  11.  
  12.                   Clear Records From             14
  13.                   Copy All From                  20
  14.                   Create Temp As                 22
  15.                   Declare                        36
  16.                   Delay                          39
  17.                   Delete Record                  41
  18.                   Derive Off                     42
  19.                   Display Status                 43
  20.                   Do..Loop                       44
  21.                   Escape On/Off                  46
  22.                   Exit Batch Menu                47
  23.                   Exit Procedure                 48
  24.                   For..Next                      51
  25.                   If Then Else                   65
  26.                   Index Off                      67
  27.                   List Variables                 79
  28.                   Multiple Lines                 93
  29.                   Odd/Even Page Print            94
  30.                   Pause On/Off                  104
  31.                   Preselect                     106
  32.                   Print                         107
  33.                   Printer Control               108
  34.                   Remark                        114
  35.                   Skip Group                    128
  36.                   Skip Record                   129
  37.                   Subindex                      135
  38.                   Update Record                 147
  39.  
  40.  
  41.                   System Values                 Page
  42.                   ─────────────
  43.  
  44.                   Blank.                          8
  45.                   Bottom Margin                   9
  46.                   Current Record                 25
  47.                   Global Number                  61
  48.                   Output                        101
  49.                   Page Number                   103
  50.                   Pi                            105
  51.                   Record Number                 113
  52.                   Sequence                      125
  53.                   System Date                   137
  54.                   System Time                   138
  55.                   Total Copies                  144
  56.                   Total Records                 145
  57. ................................................................................
  58.  
  59.  
  60.                   Functions                     Page
  61.                   ─────────
  62.  
  63.                   Abs                             1
  64.                   Chr$                           13
  65.                   Datetext                       32
  66.                   Dayofmonth                     33
  67.                   Dayofweek                      34
  68.                   Dayofyear                      35
  69.                   Default                        37
  70.                   Hours                          63
  71.                   If                             64
  72.                   Intext                         73
  73.                   Jointext                       74
  74.                   Lefttext                       75
  75.                   Lengthtext                     76
  76.                   Lookup                         80
  77.                   Lower                          81
  78.                   Makedate                       82
  79.                   Maketime                       83
  80.                   Maths                          84
  81.                   Midtext                        88
  82.                   Minutes                        89
  83.                   Mod                            90
  84.                   Month                          91
  85.                   Proper                        109
  86.                   Random                        111
  87.                   Retail                        116
  88.                   Reverse                       118
  89.                   Righttext                     119
  90.                   Round                         120
  91.                   Seconds                       124
  92.                   Spacepad                      130
  93.                   Spellday                      131
  94.                   Spellmonth                    132
  95.                   Stringof                      134
  96.                   Timeampm                      143
  97.                   Upper                         148
  98.                   V.A.T. Functions              149
  99.                   Year                          150
  100.                   Zeropad                       151
  101.  
  102.  
  103.                   Field Controls                Page
  104.                   ──────────────
  105.  
  106.                   Beep                            7
  107.                   Clearfields                    15
  108.                   Delay                          38
  109.                   Run                           121
  110. ................................................................................
  111.  
  112.  
  113.                   Field Types                   Page
  114.                   ───────────
  115.  
  116.                   Choice                         12
  117.                   Date                           31
  118.                   Fixed Point                    49
  119.                   Floating Point                 50
  120.                   Formatted Text                 59
  121.                   Integer                        72
  122.                   Text                          140
  123.                   Text Block                    141
  124.                   Time                          142
  125.  
  126.  
  127.                   Field Derivation Prefixes     Page
  128.                   ─────────────────────────
  129.  
  130.                   Autodial                        5
  131.                   Current                        24
  132.                   Goto (Field) Next              62
  133.                   Retest                        117
  134.                   Start Here                    133
  135.  
  136.  
  137.                   Utilities                     Page
  138.                   ─────────
  139.  
  140.                   Alter Vat Rates                 4
  141.                   Backup Application              6
  142.                   Change Password                11
  143.                   Data Import                    28
  144.                   Delete Choice Lists            40
  145.                   Install Form                   69
  146.                   Install Printer                70
  147.                   Install Procedure              71
  148.                   List File Names                78
  149.                   Options                       100
  150.                   Pack Data Forms               102
  151.                   Rebuild Directories           112
  152.                   Restore                       115
  153.                   Screen Colours                123
  154.                   Set Paper Length              126
  155. ................................................................................
  156.  
  157.  
  158.                   User Menu Functions           Page
  159.                   ───────────────────
  160.  
  161.                   Menu Calls                     87
  162.  
  163.  
  164.                   Operators                     Page
  165.                   ─────────
  166.  
  167.                   Arithmetic                     97
  168.                   Logical                        99
  169.                   Relational                     98
  170.  
  171.  
  172.                   Methods                       Page
  173.                   ───────
  174.  
  175.                   Address Labels                  2
  176.                   Bypass Sign-on Sreen           10
  177.                   Compound Index                 16
  178.                   Compound Lookups               19
  179.                   Correcting Stats.              21
  180.                   Creating Runtime               23
  181.                   Customize Help Line            26
  182.                   Cyclic Procedures              27
  183.                   Data Type Conversion           30
  184.                   Duplicate Prevention           45
  185.                   Form Letters                   57
  186.                   Global Defaults                60
  187.                   Input Screen Format            68
  188.                   Linking Applications           77
  189.                   Maximizing Speed               85
  190.                   Multiple Columns               92
  191.                   Q And A Input Screen          110
  192.                   Runtime Auto Start            122
  193.                   Set System Values             127
  194.                   Tabulation                    139
  195.                   Totals & Sub Totals           146
  196. ................................................................................
  197.  
  198.  
  199.  
  200.       ABS                        FUNCTION                         ABS
  201.  
  202.  
  203.       This function returns the absolute (positive) value of a
  204.       number.
  205.  
  206.       Ex. abs(length - breadth)
  207.          This returns 6 if length = 12 and breadth = 6
  208.          or if length = 6 and breadth = 12
  209.  
  210.  
  211.       Acceptable parameters
  212.  
  213.       Numeric value
  214.       Numeric expression
  215.       Numeric field/variable
  216.       Any function which returns a numeric value
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229.  
  230.  
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242.  
  243.  
  244.  
  245.  
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.                                 - 1 -
  257. ................................................................................
  258.  
  259.  
  260.  
  261.       ADDRESS LABELS              METHOD               ADDRESS LABELS
  262.  
  263.  
  264.       The following procedure prints two columns of address labels
  265.       from a "Addr" form.
  266.  
  267.       .......................Procedure code................
  268.  
  269.       Declare output fields
  270.          Addr.name : Addr.street : Addr.town : Addr.pcode
  271.          Lname : Lstreet : Ltown : Lpcode
  272.       end
  273.       for Addr
  274.          if Lname = blank then
  275.             Lname = Addr.name : Lstreet = Addrstreet
  276.             Ltown = Addr.town : Lpcode = Addrpcode
  277.          else
  278.             print list items
  279.             Lname = blank : Lstreet = blank
  280.             Ltown = Blank : Lpcode  = blank
  281.          end if
  282.       next
  283.       if Lname <> blank then print list items
  284.  
  285.       ....................Output Format........................
  286.  
  287.       .List Items
  288.  
  289.            {Lname field        }       {Addr.name field    }
  290.            {Lstreet field      }       {Addr.street field  }
  291.            {Ltown field        }       {Addr.town field    }
  292.            {Lpcode field       }       {Addr.pcode field   }
  293.  
  294.       .end
  295.  
  296.  
  297.       The field positioning and the distance between the .List Items
  298.       and .end can be adjusted to fit the label paper.
  299.  
  300.  
  301.       If your label paper has three columns then you could use the
  302.       following procedure.
  303.  
  304.       declare output fields
  305.          Addr.name : Addr.street : Addr.town : Addr.pcode
  306.          Mname : Mstreet : Mtown : Mpcode
  307.          Lname : Lstreet : Ltown : Lpcode
  308.       end
  309.       declare variables
  310.          x as number
  311.       end
  312.  
  313.       Continued.
  314.  
  315.  
  316.  
  317.                                 - 2 -
  318. ................................................................................
  319.  
  320.  
  321.  
  322.       ADDRESS LABELS              METHOD               ADDRESS LABELS
  323.  
  324.  
  325.       for addr
  326.          x = x + 1
  327.          if Mod(x,3) = 1 then
  328.             Lname = Addr.name : Lstreet = Addr.street
  329.             Ltown = Addr.town : Lpcode = Addr.pcode
  330.          end if
  331.          if Mod(x,3) = 2 then
  332.             Mname = Addr.name : Mstreet = Addr.street
  333.             Mtown = Addr.town : Mpcode = Addr.pcode
  334.          end if
  335.          if Mod(x,3) = 0 then
  336.             Print list items
  337.             Lname = Blank : Lstreet = blank
  338.             Ltown = blank : Lpcode = Blank
  339.             Mname = Blank : Mstreet = blank
  340.             Mtown = blank : Mpcode = Blank
  341.          end if
  342.       next
  343.       If Lname <> blank then print list items
  344.  
  345.  
  346.       .........................output format...................
  347.  
  348.  
  349.       .list items
  350.  
  351.          { Lname       }    { Mname       }   { Addr.name   }
  352.          { Lstreet     }    { Mstreet     }   { Addr.street }
  353.          { Ltown       }    { Mtown       }   { Addr.town   }
  354.          { Lpcode      }    { Mpcode      }   { Addr.pcode  }
  355.  
  356.       .end
  357.  
  358.  
  359.  
  360.       See Also:- Form Letters
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.                                 - 3 -
  379. ................................................................................
  380.  
  381.  
  382.  
  383.       ALTER VAT RATES            UTILITY              ALTER VAT RATES
  384.  
  385.  
  386.       The five VAT rates used by the VAT functions can be altered
  387.       either from the utilities menu or from a user menu function.
  388.       Just select "Alter VAT rates" - edit the percentages and press
  389.       F2 to save the new values.
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.  
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.                                 - 4 -
  440. ................................................................................
  441.  
  442.  
  443.  
  444.       AUTODIAL               DERIVATION PREFIX               AUTODIAL
  445.  
  446.  
  447.       Easy Base will dial (via a Hayes compatible modem) direct from
  448.       any form or procedure input screen.
  449.  
  450.       To use the Auto dialling facility, all you have to do is place
  451.       the "autodial" keyword in the derivation of the field which
  452.       contains the telephone number. If the field already has a
  453.       derivation then add "autodial" as a prefix.
  454.  
  455.       Ex. Autodial Lookup(customers,phone)
  456.  
  457.       To initiate the call type Ctrl + D.
  458.  
  459.       By default Easy Base uses tone dialling via COM1. If your modem
  460.       is connected to COM2 you can set this up from the Options item
  461.       on the Utilities menu.
  462.  
  463.       If your exchange does not recognize tone dialling then you can
  464.       pulse dial by pressing Ctrl + P.
  465.  
  466.       If you operate from a private exchange and have to wait for an
  467.       outside line after dialling 9 then place a "W" between the 9
  468.       and the rest of the number.
  469.  
  470.  
  471.       Note:-
  472.  
  473.       1.   You can only have one derivation prefix on any one field.
  474.  
  475.       2.   The Autodial prefix cannot be tested in derivation test
  476.            mode.
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.                                 - 5 -
  501. ................................................................................
  502.  
  503.  
  504.  
  505.       BACKUP APPLICATION         UTILITY           BACKUP APPLICATION
  506.  
  507.  
  508.       Easy Base includes an inbuilt Backup system for your
  509.       applications and data.
  510.  
  511.       If you select "Backup Application" from the utilities menu then
  512.       Easy Base will backup your entire application - Choicelist
  513.       fields - Forms - Data and procedures. The backup system will
  514.       split large files across multiple disks automatically.
  515.  
  516.       When an application is finished and you have backup copies then
  517.       backing up choice lists and procedures is wasteful of time and
  518.       floppies. You can backup only the users data by calling "Backup
  519.       Data" from a user menu.
  520.  
  521.       Backup Principles.
  522.  
  523.       The reason for a backup is that in the event of a computer or
  524.       hard disk failure you will have your application or data to
  525.       restore on the new machine.
  526.  
  527.  
  528.       If you have no backup and your machine fails then you have lost
  529.       all your data. If you have only one backup and your machine
  530.       fails while doing a backup then you have lost all your data.
  531.  
  532.       The principle of safe backing up is to keep two sets of backup
  533.       disks in separate boxes marked "Latest" and "Previous".
  534.       Whenever you do a backup you use the disks from the "Previous"
  535.       box - move the disks from the "Latest" to the "Previous" and
  536.       put your new backups in the latest box when completed.
  537.  
  538.       This not only overcomes the problem of a failure during backup
  539.       but also provides a secondary set of disks if any of the
  540.       "Latest" disks turn out to be faulty when you come to restore.
  541.  
  542.       If you ever have to use a backup disk and find that it has
  543.       developed a bad sector then you can attempt a recovery with a
  544.       utility such as "Norton" Disk Test. Easy Base leaves
  545.       approximately 5K of unused disk space on all backup disks so
  546.       that such a utility has somewhere to move bad sectors to.
  547.  
  548.       To save disk space, Easy Base does not backup index files. If
  549.       you ever have to use a backup disk then the index files are
  550.       rebuilt after restoring the data.
  551.  
  552.  
  553.       See Also:-  Restore
  554.  
  555.  
  556.  
  557.  
  558.  
  559.  
  560.  
  561.                                 - 6 -
  562. ................................................................................
  563.  
  564.  
  565.  
  566.       BEEP                     FIELD CONTROL                     BEEP
  567.  
  568.  
  569.       The "beep" control is used in field derivations to alert the
  570.       user to input errors. In addition to sounding the beeper the
  571.       "beep" control has two optional additional parts - A message to
  572.       be sent to the message line and cursor redirection. This is
  573.       normally to the field in which the error has been made but can
  574.       be to any field.  Field controls are appended to field
  575.       derivations and are enclosed in square brackets.
  576.  
  577.       Ex.  If(partno < 0,blank[beepPart Numbers must not be
  578.       negativeCursor partno],partno)
  579.  
  580.       In this example, if the user enters a negative number in the
  581.       partno field the computer will beep,the number will be cleared
  582.       from the field, the message "Part Numbers must not be negative"
  583.       will be displayed on the message line and the cursor will
  584.       return to the "partno" field.
  585.  
  586.       Ex. If(paid = "no" and chequeno <> blank,paid[beepEither bill
  587.       has been paid or cheque number entered in errorCursor
  588.       paid],paid)
  589.  
  590.       In Easy Base, division by zero is not trapped as an error.
  591.       There is a very good reason for this.  When you start a new
  592.       record and all the fields are blank then any field which
  593.       provides a value for a division in another field would cause a
  594.       division by zero error before its value had been entered.
  595.  
  596.       Whenever Easy Base encounters a division by Zero it divides by
  597.       one instead.  This is perfectly acceptable in most business
  598.       applications.  However, if you need to be warned of a division
  599.       by zero in formulae then you can provide your own error trap
  600.       using the "Beep" control.
  601.  
  602.       Ex.
  603.  
  604.          If( T4 = 0,blank[beepDivision by Zero Value from Field T4],
  605.                       T4)
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.                                 - 7 -
  623. ................................................................................
  624.  
  625.  
  626.  
  627.       BLANK.                   SYSTEM VALUE                    BLANK.
  628.  
  629.  
  630.       In Easy Base the value of any field which does not contain
  631.       characters is represented by the word "Blank" irrelevant of
  632.       data type.
  633.  
  634.       A numeric field returns the value "Blank" only when the field
  635.       is empty. If it has a value of zero then it is NOT blank.  In
  636.       fact, the main advantage of recognizing "Blank" is that you can
  637.       distinguish between zero value and empty numeric fields.
  638.  
  639.       There is, however, one slight disadvantage.  If a text field
  640.       contains ONLY the word blank and you use its value in a
  641.       derivation then the word "Blank" from the field will disappear.
  642.  
  643.       The "Name" field at the top left hand side of this page is
  644.       derived by the formula Upper(Name).  You will notice that
  645.       "Blank" is followed by a full stop.  If it were not then the
  646.       upper function would return "                    ".
  647.  
  648.       You can also remove a fields contents by setting it equal to
  649.       blank.
  650.  
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657.  
  658.  
  659.  
  660.  
  661.  
  662.  
  663.  
  664.  
  665.  
  666.  
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674.  
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.  
  683.                                 - 8 -
  684. ................................................................................
  685.  
  686.  
  687.  
  688.       BOTTOM MARGIN            SYSTEM VALUE             BOTTOM MARGIN
  689.  
  690.  
  691.       Throughout a procedure which has a printed output, Easy base
  692.       keeps track of the length of page remaining (in inches) in the
  693.       system value "Bottom Margin". The Bottom margin value is used
  694.       to control pagination in procedures which "Report" on data.
  695.  
  696.       The "Bottom Margin" value is based on the paper type entered
  697.       from the Utilities Menu. You must set the type of paper you are
  698.       using before using "Bottom Margin".
  699.  
  700.       Ex.
  701.       Line feed: Line feed: Line feed
  702.       For employees
  703.          print list items
  704.          if bottom margin < .5 then
  705.             page feed: line feed :line feed : line feed
  706.          else
  707.             line feed
  708.          end if
  709.       next
  710.  
  711.       In the above example the list items section is printed with a
  712.       blank line between each and with a half inch top and bottom
  713.       page margin.
  714.  
  715.       When you base decisions on the "Bottom margin" value you should
  716.       always do so with a "Greater Than" or "Less Than" operator. If
  717.       you used " If Bottom margin = .5 then Page feed" your page
  718.       would only be ejected if and when the "Bottom Margin" value was
  719.       exactly 0.5  As most printing is done at six lines to the inch
  720.       it is most unlikely that the "Bottom margin" value would ever
  721.       be half an inch.
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.                                 - 9 -
  745. ................................................................................
  746.  
  747.  
  748.  
  749.       BYPASS SIGN-ON SREEN        METHOD         BYPASS SIGN-ON SREEN
  750.  
  751.  
  752.       You can bypass the sign-on screen for both the developers
  753.       password and any User-menu password by adding the sub directory
  754.       and password to the start up command line. This is particularly
  755.       useful in finished applications as the application can be
  756.       called directly from a hard disk menu system - the sign on
  757.       screen will not appear and the application will start as if it
  758.       were a stand alone program.
  759.  
  760.       To start an application in the accounts sub directory whos
  761.       start up menu password is "start" use the command line:
  762.  
  763.       EB accounts/start
  764.  
  765.       If you have several applications in different sub directories
  766.       all with the same password you can skip entering the password
  767.       but still choose the sub directory by using the command line:
  768.  
  769.       EB password
  770.  
  771.       See also Runtime Autostart
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.  
  802.  
  803.  
  804.  
  805.                                 - 10 -
  806. ................................................................................
  807.  
  808.  
  809.  
  810.       CHANGE PASSWORD            UTILITY              CHANGE PASSWORD
  811.  
  812.  
  813.       You can change your developers access password with this item
  814.       on the utilities menu.
  815.  
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.                                 - 11 -
  867. ................................................................................
  868.  
  869.  
  870.  
  871.       CHOICE                    FIELD TYPE                     CHOICE
  872.  
  873.  
  874.       If you define a field as the "Choice" type a window will open
  875.       into which you can type up to seventeen different choices.
  876.       When you have entered your choices you will be asked to give a
  877.       name to your choice list. Once a choice list has been saved it
  878.       can be used in any other choice field in any other form or
  879.       input screen.
  880.  
  881.       Once a choice list has been saved you can edit the contents but
  882.       not the field length. Editing a choice list in one form
  883.       automatically edits it for any other form.
  884.  
  885.       If you need to alter a list such that the field length will
  886.       change then you must create a new list. You can erase the old
  887.       one from the utilities menu.  If the list is used in more than
  888.       one form then you must redefine it in all the other forms in
  889.       which it is used
  890.  
  891.       When the cursor enters a choice field your choice list will be
  892.       displayed for the user to choose from. He cannot enter any
  893.       value other than one from the list.
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.                                 - 12 -
  928. ................................................................................
  929.  
  930.  
  931.  
  932.       CHR$                       FUNCTION                        CHR$
  933.  
  934.  
  935.       The Chr$ function returns the character whose ASCII number is
  936.       supplied as the parameter.
  937.  
  938.       Ex.   Chr$(171)
  939.             < Returns "½">
  940.  
  941.       Ex.   Jointext(Chr$(227),"r",Chr$(253))
  942.             < Returns "πr²"
  943.  
  944.       In Easy Base, text fields are automatically justified left.
  945.       This is desirable in record entry as it prevents the user from
  946.       entering leading spaces in indexed fields and consequently
  947.       trashing alphabetic printouts. However, you may wish to right
  948.       justify or centre justify text in printouts. For example, the
  949.       righthand "Chr$" at the top of this page is right justified in
  950.       its field. You can use the ASCII character 255 to achieve right
  951.       or centre justification.
  952.  
  953.       Ex.
  954.  
  955.       Heading = jointext(stringof((30-lengthtext(name))/2,Chr$(255)),
  956.       name)
  957.           < This centres name in the 30 character field "heading">
  958.  
  959.       Ex.
  960.  
  961.       Heading =Jointext(stringof(40-lengthtext(name),Chr$(255)),name)
  962.  
  963.          < This right justifies name in a 40 character field
  964.            "Heading">
  965.  
  966.  
  967.       CAUTION:
  968.  
  969.       You can produce any ASCII character ( 0 - 255 ) with the Chr$
  970.       function. ASCII characters 0 to 31 are used as printer controls
  971.       and although you can use them freely on screen you should never
  972.       include them in a procedure output which will be sent to the
  973.       printer.
  974.  
  975.       Acceptable parameters:
  976.  
  977.       Numeric value, field, variable, expression or function
  978.       returning a number between 0 and 255
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.                                 - 13 -
  989. ................................................................................
  990.  
  991.  
  992.  
  993.       CLEAR RECORDS FROM     PROCEDURE COMMAND     CLEAR RECORDS FROM
  994.  
  995.  
  996.       The "Clear Records From" command clears all records from a form
  997.       by erasing its data and index files. If you need to erase all
  998.       records form a form always use the "Clear Records" command
  999.       rather than "Delete Record" command. It is much faster and does
  1000.       not require the form to be re-packed afterward.
  1001.  
  1002.       Ex.
  1003.  
  1004.       If input.confirm = "yes" then clear records from invoices
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.                                 - 14 -
  1050. ................................................................................
  1051.  
  1052.  
  1053.  
  1054.       CLEARFIELDS              FIELD CONTROL              CLEARFIELDS
  1055.  
  1056.  
  1057.       The "Clearfields" control blanks out all other fields on a form
  1058.       or procedure input screen whenever the field containing the
  1059.       control is changed.
  1060.  
  1061.       The primary use for the "Clearfields" control is to force
  1062.       default lookups to re-derive for procedures which edit data.
  1063.  
  1064.       For Example - If you wrote a procedure to alter customers
  1065.       addresses and telephone numbers then you would have three
  1066.       fields on the input screen.
  1067.  
  1068.       Accountno   derived   lookup(customers,accountno)
  1069.  
  1070.       address     derived   default(lookup(customers,address))
  1071.  
  1072.       Tel         derived   default(lookup(customers,tel))
  1073.  
  1074.       When you enter a customers account number, his old address and
  1075.       telephone number will be looked up, but the "Default" function
  1076.       will allow you to edit them. The procedure code would then
  1077.       update the record with the new address and phone number.
  1078.  
  1079.       The problem is, that having entered an account number and
  1080.       looked up the other fields, if you then realize you have
  1081.       entered the wrong account number and change it, the other
  1082.       fields will not re-derive because they now have a default
  1083.       value.  To get them to lookup based on the new account number
  1084.       you would have to take the cursor to each field and clear it
  1085.       with the F6 key.
  1086.  
  1087.       you can automate this process by adding the "Clearfields"
  1088.       control to the accountno derivation:-
  1089.  
  1090.       lookup(customers,accountno)[clearfields]
  1091.  
  1092.  
  1093.       Note:  The "Clearfields" control will only work when appended
  1094.       to a derivation which is already dependent on the value of the
  1095.       field. If you want to clear fields based on a change to a field
  1096.       which has no other derivation then you must derive the field
  1097.       with its own name plus the "Clearfields" control.
  1098.  
  1099.       In a field "Number" the derivation - Number[clearfields] - will
  1100.       clear all other fields when the "Number" field is edited but
  1101.       the derivation [clearfields] will have no effect.
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.                                 - 15 -
  1111. ................................................................................
  1112.  
  1113.  
  1114.  
  1115.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1116.  
  1117.  
  1118.       If you need to list records from a form in such a way that they
  1119.       are grouped by one field but with each record in the group
  1120.       ordered by another then you can either use a compound index
  1121.       field or "Subindex" the group during the procedure.
  1122.  
  1123.       A compound index field is simply an additional field in which
  1124.       the contents of two or more fields are compounded using the
  1125.       "Jointext" function. The field is indexed and the index on that
  1126.       field can then be used to select records with the desired group
  1127.       ordering.
  1128.  
  1129.       For example:- A "Videos" form has fields for "Title",
  1130.       "RentalPrice" and "Category".
  1131.  
  1132.       To list the records grouped by "Category" but with the "Titles"
  1133.       in each category in alphabetic order you add another field to
  1134.       the form which is Text, Indexed and long enough to hold the
  1135.       contents of both the "category" and "Title" fields. The field
  1136.       is derived by joining the text of the "Category" and "Title"
  1137.       fields.
  1138.  
  1139.       There are a couple of minor complications in creating compound
  1140.       index fields. Firstly the "Jointext" function by default strips
  1141.       any trailing space characters from the text it is joining. If a
  1142.       straight "Jointext" function was used and the first two videos
  1143.       entered were "A Bridge Too Far" and "Snow White" then the
  1144.       compound fields would derive as:-
  1145.  
  1146.       "WarA Bridge Too Far"  and
  1147.       "CartoonSnow White"
  1148.  
  1149.       When what you need is:-
  1150.  
  1151.       "War      A Bridge Too Far"  and
  1152.       "Cartoon  Snow White      "
  1153.  
  1154.       To produce the desired spacing in the compound field use the
  1155.       "Spacepad" function.
  1156.  
  1157.       If the length of the "Category" field is 15 then derive the
  1158.       compound field with - Jointext(spacepad(category,15),title)
  1159.  
  1160.       If you are compounding more than two fields then "spacepad" all
  1161.       the fields being joined to their own field's length except the
  1162.       last one.
  1163.  
  1164.       The maximum length of a text field in Easy Base is 80
  1165.       characters. If the fields you need to compound total more than
  1166.       80 then you must reduce the length of the field names. Compound
  1167.       indices in Text Block fields should not be used.
  1168.  
  1169.  
  1170.  
  1171.                                 - 16 -
  1172. ................................................................................
  1173.  
  1174.  
  1175.  
  1176.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1177.  
  1178.  
  1179.       Once you have created a compound field and checked that it
  1180.       derives correctly it is normal to define it as invisible and no
  1181.       entry anyway as it is not its contents that are of interest but
  1182.       the order which its index produces.
  1183.  
  1184.       Ex.   Assuming the compound field was called "catgroup"
  1185.  
  1186.       ..........................code..................
  1187.       for videos with catgroup in order
  1188.          print list items
  1189.       next
  1190.       ........................format.................
  1191.       .List Items
  1192.             {Videos.Category Field}     {Videos.Title Field}
  1193.       .End
  1194.  
  1195.  
  1196.       Ex.
  1197.  
  1198.  
  1199.       ...........................code....................
  1200.       declare variables
  1201.          catcheck as text
  1202.       end
  1203.       for videos with catgroup in order
  1204.          if catcheck <> videos,category then print group header
  1205.          catcheck = videos.category
  1206.          print list items
  1207.       next
  1208.       ..........................format...............
  1209.       .Group Header
  1210.          -------------------------------------
  1211.          Films categorized as {category field}
  1212.          -------------------------------------
  1213.       .List Items
  1214.                     {Title field}
  1215.       .End
  1216.  
  1217.       There is yet a further complication if one or more of the
  1218.       fields to be compounded is numeric. Easy Base index files are
  1219.       sorted alphabetically if the field is text and numerically if
  1220.       the field is numeric. A compound field is always text so if you
  1221.       need to compound a numeric field you have to ensure that it
  1222.       will sort alphabetically to the same order that it sorts
  1223.       numerically. The text of numeric values sort alphabetically to
  1224.       the same order as their values only if they all have the same
  1225.       number of digits either side of the decimal point.
  1226.  
  1227.       6  12 and 34 sort alphabetically as 12  34  6
  1228.       but
  1229.       06 12 and 34 sort alphabetically as 06  12  34
  1230.  
  1231.  
  1232.                                 - 17 -
  1233. ................................................................................
  1234.  
  1235.  
  1236.  
  1237.       COMPOUND INDEX              METHOD               COMPOUND INDEX
  1238.  
  1239.  
  1240.       Easy Base provides the function "Zeropad" to pad numbers to the
  1241.       same length for compounding.  The "Zeropad" function has three
  1242.       parameters - The number to be padded, the number of digits left
  1243.       of the decimal to pad to and the number of digits right of the
  1244.       decimal to pad to. All three parameters must be supplied. If
  1245.       the number is an integer then the third parameter is 0.
  1246.  
  1247.       Ex. To list the "Videos" records grouped by rental price with
  1248.       the titles in each price group in order you would create a
  1249.       compound field derived with:-
  1250.  
  1251.       Jointext(zeropad(rentalprice,2,2),title)
  1252.  
  1253.       Ex.
  1254.  
  1255.       A "Ships" form has fields for "Type" and "Displacement"
  1256.  
  1257.       To list the ships grouped by type with the Displacement in each
  1258.       group in order you would create a compound field derived with:-
  1259.  
  1260.       jointext(spacepad(type,15),zeropad(displacement,8,0))
  1261.  
  1262.       In many cases where you wish to compound a mixture of text and
  1263.       numeric fields you will require the numeric values to be listed
  1264.       in descending order while the text value is to be in alphabetic
  1265.       order.
  1266.  
  1267.       In the above example for ships, had you wished each group to
  1268.       be listed with "Displacement" in descending order you would
  1269.       derive the compound field as:-
  1270.  
  1271.       jointext(spacepad(type,15),reverse(zeropad(displacement,8,0)))
  1272.  
  1273.       The "Reverse" function simply inverts the ACSII number of each
  1274.       character in its parameter so that it will sort in reverse
  1275.       order in the index file.
  1276.  
  1277.       The "Reverse" function works equally well on text values
  1278.       although reverse alphabetic lists are seldom required.
  1279.  
  1280.       The "Zeropad" function will only pad out a number to the size
  1281.       required. It will not trim the number if it is already longer
  1282.       than one of the pad lengths. You should not therefore create
  1283.       compound fields with Floating Point numbers.
  1284.  
  1285.       If you compound a date or time field you should zeropad it to
  1286.       5,0 as the text which will be used is actually the date or time
  1287.       fields numeric value.
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.                                 - 18 -
  1294. ................................................................................
  1295.  
  1296.  
  1297.  
  1298.       COMPOUND LOOKUPS            METHOD             COMPOUND LOOKUPS
  1299.  
  1300.  
  1301.       Occasionally, in an input screen, you will wish to lookup
  1302.       details from a form whose unique field is a compound of two
  1303.       others.  As an example, if you wished to lookup details from
  1304.       the "Userlist" form, mentioned in the manual, then you would
  1305.       have to base the lookups on a relationship between a field on
  1306.       the input screen and the "UNI" field in "Userlist". The "UNI"
  1307.       field in userlist is a combination of the "Aircraft" forms
  1308.       "Knownas" field and the "Airlines" form "Name" field.
  1309.  
  1310.       Although you could simply use a field "UNI" on the input screen
  1311.       and derive it :- Lookup(userlist,uni) - this would mean that
  1312.       the end user would have to enter the whole of the aircraft
  1313.       Knownas part plus part of the airlines name part plus the "*"
  1314.       in order to get the lookup.
  1315.  
  1316.       This would not only be awkward to use but would also entail
  1317.       explaining compound fields to the end user.
  1318.  
  1319.       You can avoid this situation by providing two fields, one in
  1320.       which the user looks up the aircraft knownas field and one in
  1321.       which he looks up the airline name. These are based on separate
  1322.       relationships between the input screen and the "Aircraft" and
  1323.       "Airlines" forms.
  1324.  
  1325.       The input screen's "UNI" field can now be made invisible with
  1326.       no user entry and derived:- Jointext(knownas,name).
  1327.  
  1328.       A relationship is entered between the input screen and the
  1329.       "Userlist" form linking the "UNI" fields and all the required
  1330.       details can then be derived :- lookup(userlist,whatever).
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341.  
  1342.  
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.                                 - 19 -
  1355. ................................................................................
  1356.  
  1357.  
  1358.  
  1359.       COPY ALL FROM          PROCEDURE COMMAND          COPY ALL FROM
  1360.  
  1361.  
  1362.       When you are transferring values from the fields of one form to
  1363.       the fields of another in preparation for a "New Record" or
  1364.       "Update Record"  you can use "Copy All From" to save time.
  1365.  
  1366.       Ex.
  1367.  
  1368.       for invoiceitems new record
  1369.          invoiceitems.item = input.item
  1370.          invoiceitems.price = input.price
  1371.          invoiceitems.quantity = input.quantity
  1372.          invoiceitems.vatrate = input.vatrate
  1373.       next
  1374.  
  1375.       can be replaced with:-
  1376.  
  1377.       for invoiceitems new record
  1378.          copy all from input
  1379.       next
  1380.  
  1381.       The data transfer in a "Copy All From" is based on the source
  1382.       and destination fields having the same name.
  1383.  
  1384.       If the source and destination fields have different data types
  1385.       Easy Base will attempt a conversion.
  1386.  
  1387.       The conversion will succeed between different numeric types and
  1388.       from numeric to text. It will fail from text to numeric and
  1389.       between any mismatch of date and time.
  1390.  
  1391.  
  1392.  
  1393.  
  1394.       See also:-  Derive Off, Duplicate Prevention
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404.  
  1405.  
  1406.  
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.                                 - 20 -
  1416. ................................................................................
  1417.  
  1418.  
  1419.  
  1420.       CORRECTING STATS.           METHOD            CORRECTING STATS.
  1421.  
  1422.  
  1423.       If you write an application in which records are entered via
  1424.       procedures and "running" statistics are kept, you will have to
  1425.       provide procedures which allow the user to correct any mistakes
  1426.       he has made.
  1427.  
  1428.       For Example: - In a "Time Sheets" application the user enters a
  1429.       time and customer on the input screen of a procedure. The
  1430.       procedure then calculates the charge, writes the charge and
  1431.       customers name to the "Timesheet" form, adds the charge to the
  1432.       "Balance" field in the "Customers" form and also adds it to the
  1433.       "Total" field in the "Workinhand" form.
  1434.  
  1435.       If the operator makes an error then correcting the entry in the
  1436.       "Timesheet" form is simply a case of updating it but to correct
  1437.       the "Balance" and "Total" fields you must add the corrected
  1438.       value and subtract the old incorrect value.
  1439.  
  1440.       To get the two values together for your procedure, create an
  1441.       input screen where the operator enters the "line" ("line" is
  1442.       the unique sequenced field in "Timesheet").  Then create two
  1443.       fields for the values. The first, "oldval" is derived
  1444.       lookup(timesheet,charge) and the second, "newval" is derived
  1445.       default(lookup(timesheet,charge).
  1446.  
  1447.       The "Oldval" field can be invisible and has no user entry.
  1448.  
  1449.       You would also add two similarly derived fields "Oldcustomer"
  1450.       and "Newcustomer".
  1451.  
  1452.       When the user edits the "Newval" and/or "Newcustomer" field and
  1453.       presses F2 , all the required values are available to the
  1454.       procedure code:-
  1455.  
  1456.       pause off : escape off
  1457.       for timesheet with line = input.line
  1458.          timesheet.charge = input.newval
  1459.          timesheet.customer = input.newcustomer
  1460.          update record
  1461.       next
  1462.       for customers with name = input.oldcustomer
  1463.          customers.balance = customers.balance - input.oldval
  1464.          update record
  1465.       next
  1466.       for customers with name = input.newcustomer
  1467.          customers.balance = customers.balance + input.newval
  1468.          update record
  1469.       next
  1470.       for workinhand
  1471.         workinhand.total = workinhand.total+input.newval-input.oldval
  1472.         update record
  1473.       next
  1474.  
  1475.  
  1476.                                 - 21 -
  1477. ................................................................................
  1478.  
  1479.  
  1480.  
  1481.       CREATE TEMP AS         PROCEDURE COMMAND         CREATE TEMP AS
  1482.  
  1483.  
  1484.       The "Create Temp As" command makes a temporary form during a
  1485.       procedure. There are two main uses for the temporary form.
  1486.  
  1487.       1.  To physically sort the records in a form.
  1488.  
  1489.       Ex.
  1490.  
  1491.       create temp as addresses
  1492.       index off:pause off:escape off:derive off
  1493.       for addresses with surname in order
  1494.          for temp new record
  1495.             copy all from addresses
  1496.          next
  1497.       next
  1498.       rename temp as addresses
  1499.  
  1500.       The other main use for the temporary file is to save time when
  1501.       the majority of records in a form are to be deleted.
  1502.  
  1503.       Ex.
  1504.       A purchases ledger form is to be cleared down at the year end
  1505.       but any unreconciled payment entries are to be retained and
  1506.       flagged as last years. If there were 15000 records in the form
  1507.       of which only 50 were unreconciled then the procedure
  1508.  
  1509.       for purchases
  1510.          if purchases.reconciled = "yes" then
  1511.             delete record
  1512.          else
  1513.             purchases.lastyear = "yes"
  1514.             update record
  1515.          end if
  1516.       next
  1517.  
  1518.       would not only take a very long time to run but would leave the
  1519.       form full of deleted records and it would have to be re-packed.
  1520.  
  1521.       The same result can be achieved very quickly and without the
  1522.       need to re-pack with the following procedure.
  1523.  
  1524.       create temp as purchases
  1525.       for purchases with reconciled = "no"
  1526.          for temp new record
  1527.             copy all from purchases
  1528.             temp.lastyear = "yes"
  1529.          next
  1530.       next
  1531.       rename temp as purchases
  1532.  
  1533.       Do not use the "Clear Records" command to wipe the old file
  1534.       before using "Rename Temp As".  If you suffered a power failure
  1535.       after clearing and before renaming you would lose your data.
  1536.  
  1537.                                 - 22 -
  1538. ................................................................................
  1539.  
  1540.  
  1541.  
  1542.       CREATING RUNTIME            METHOD             CREATING RUNTIME
  1543.  
  1544.  
  1545.       To create a distributable application with the Easy Base
  1546.       Royalty free Runtime Module, first, ensure that your
  1547.       application has a user menu with a start up password. If you
  1548.       wish your runtime application to start without a sign on screen
  1549.       then this password should be "Autostart".
  1550.  
  1551.       Make a new directory for your module and copy all the files
  1552.       from the Easy Base sub directory in which you developed the
  1553.       application to it.
  1554.  
  1555.       Copy the Configuration file "EB.SET" from your Easy Base
  1556.       directory to this directory.
  1557.  
  1558.       Insert the Runtime Module disk in a floppy drive. Change to
  1559.       that drive and type "MODULE".
  1560.  
  1561.       The "Module" program will first ask you for the path to the
  1562.       application files. Once you enter this it will unpack the
  1563.       runtime files into your new directory.
  1564.  
  1565.       It will then ask for the name of your application. The name you
  1566.       supply here will be displayed on any sign on screens and also
  1567.       on the shutdown "Thank you for using - " line.
  1568.  
  1569.       It will then ask you for your copyright line. The text you
  1570.       enter here will replace the line "Application of Easy Base -
  1571.       Not for Resale" which appears above your menus.
  1572.  
  1573.       Finally, you will be asked for the Executable file name you
  1574.       wish to use for your program.
  1575.  
  1576.       When you have entered the details - Press F2 and your
  1577.       application will be complete and ready to sell.
  1578.  
  1579.                       --------------------------
  1580.  
  1581.       EASY INSTALL UTILITY
  1582.  
  1583.       For professional distribution disks just like the ones Easy
  1584.       Software is distributed on, you can purchase Easy Install.
  1585.       This utility will compress your application and create a
  1586.       distribution disk with an install program customized for your
  1587.       application.
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597.  
  1598.                                 - 23 -
  1599. ................................................................................
  1600.  
  1601.  
  1602.  
  1603.       CURRENT                DERIVATION PREFIX                CURRENT
  1604.  
  1605.  
  1606.       In Easy Base, fields are not normally derived when a previously
  1607.       entered record is viewed on screen. You can force a field to be
  1608.       rederived when viewed by prefixing the derivation with
  1609.       "current".
  1610.  
  1611.       Ex.  An invoice form has three fields Ivdate,Cdate and age.
  1612.  
  1613.       Ivdate is derived as   "system date"
  1614.       Cdate is derived as    "current system date"
  1615.       age is derived as      jointext(Cdate-Ivdate," Days old")
  1616.  
  1617.       Each time a record is viewed the Cdate field is rederived with
  1618.       the current system date and the age field shows the number of
  1619.       days since the record was filed.
  1620.  
  1621.       Ex.
  1622.  
  1623.       A form is used to price a certain job. It consists of fields
  1624.       for materials and their prices which are looked up from a
  1625.       "stock" form. If the primary lookup fields are prefixed with
  1626.       "current"   -  "current lookup(stock,item)"
  1627.  
  1628.       then each time a record is viewed it will reprice the job using
  1629.       the latest prices from the "stock" file.
  1630.  
  1631.       Please note that in the case of lookups, prefixing a secondary
  1632.       lookup has no effect. In the above example
  1633.  
  1634.         "current lookup(stock,price)"  would not work
  1635.  
  1636.       Provided that the primary lookup field is prefixed with
  1637.       "current" then any secondary lookups will also be rederived.
  1638.  
  1639.  
  1640.       The values of "Current" fields are also rederived whenever they
  1641.       are accessed in procedure code but they are NOT REDERIVED when
  1642.       they are accessed by a Lookup function.
  1643.  
  1644.  
  1645.       Note: You can only have one prefix on any one field derivation.
  1646.  
  1647.  
  1648.  
  1649.  
  1650.  
  1651.  
  1652.  
  1653.  
  1654.  
  1655.  
  1656.  
  1657.  
  1658.  
  1659.                                 - 24 -
  1660. ................................................................................
  1661.  
  1662.  
  1663.  
  1664.       CURRENT RECORD           SYSTEM VALUE            CURRENT RECORD
  1665.  
  1666.  
  1667.       Whenever a procedure is processing a "FOR" loop the number of
  1668.       the record being processed is available in the "Current Record"
  1669.       system value. The "Current Record" value is the records actual
  1670.       number in the form, not the number of records processed.
  1671.  
  1672.       Ex.
  1673.  
  1674.       for books with category = "fiction"
  1675.          count = count + 1
  1676.          Posn = current record
  1677.       next
  1678.  
  1679.       If the first book found with the category "fiction" is the
  1680.       fifteenth record in the file then count will return 1 and
  1681.       Posn will return 15.
  1682.  
  1683.  
  1684.       The "Current Record" value has no meaning in field derivations.
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  
  1690.  
  1691.  
  1692.  
  1693.  
  1694.  
  1695.  
  1696.  
  1697.  
  1698.  
  1699.  
  1700.  
  1701.  
  1702.  
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.  
  1711.  
  1712.  
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.                                 - 25 -
  1721. ................................................................................
  1722.  
  1723.  
  1724.  
  1725.       CUSTOMIZE HELP LINE         METHOD          CUSTOMIZE HELP LINE
  1726.  
  1727.  
  1728.       You can replace the default help line (bottom line) in both
  1729.       data entry and procedure input screens.
  1730.  
  1731.       Press F6 in form or input screen design to access the help
  1732.       line.
  1733.  
  1734.       If you wish to revert to the default help line just erase your
  1735.       customized one.
  1736.  
  1737.  
  1738.  
  1739.  
  1740.  
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746.  
  1747.  
  1748.  
  1749.  
  1750.  
  1751.  
  1752.  
  1753.  
  1754.  
  1755.  
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765.  
  1766.  
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.  
  1775.  
  1776.  
  1777.  
  1778.  
  1779.  
  1780.  
  1781.                                 - 26 -
  1782. ................................................................................
  1783.  
  1784.  
  1785.  
  1786.       CYCLIC PROCEDURES           METHOD            CYCLIC PROCEDURES
  1787.  
  1788.  
  1789.       In many applications you will come across the situation where
  1790.       you need a procedure which will perform the same actions on a
  1791.       given set of records. For example, in a payroll system the
  1792.       procedure which calculates the employees wage and deductions
  1793.       has to be repeated for each employee so that their hours can be
  1794.       entered. If you simply enter each employees Worksno and lookup
  1795.       his or her details then it will be easy to miss an employee or
  1796.       to do one twice.
  1797.  
  1798.       To avoid this you can create a procedure which will cycle each
  1799.       employee through the input screen and terminate when all
  1800.       employees have been processed.
  1801.  
  1802.       On the employees form, add a field "Cycled" which is a single
  1803.       character indexed field derived :- Default("N").
  1804.  
  1805.       On the procedure input screen add an invisible field "Cycled"
  1806.       which is derived "N"
  1807.  
  1808.       You now enter two relationships between the procedure and the
  1809.       employees form. The main relationship "Employees" links the
  1810.       fields "Worksno" and the second, lets call it "Cycled" links
  1811.       the "Cycled" fields.
  1812.  
  1813.       On the input screen you derive the "Worksno" field as
  1814.       Lookup(cycled,worksno) and all the other details as
  1815.       lookup(employees,Whatever).
  1816.  
  1817.       When you run the procedure, the first employees details will be
  1818.       loaded automatically and all you have to enter are his hours.
  1819.  
  1820.       To have the next employee loaded after you run the procedure,
  1821.       the procedure code simply includes the lines:-
  1822.  
  1823.       for employees with worksno = input.worksno
  1824.          employees.cycled = "Y"
  1825.          update record
  1826.       next
  1827.  
  1828.       When all employees have been processed the "Worksno" field will
  1829.       derive blank as there are no employees with "N" in the "Cycled"
  1830.       field. You can therefore pass a "finished" message by altering
  1831.       the derivation of "Worksno" to :-
  1832.  
  1833.         if(lookup(cycled,worksno)=blank,blank[beepAll Employees have
  1834.         now been processed],lookup(cycled,worksno))
  1835.  
  1836.       To reset cycling for the next payroll you write an additional
  1837.       procedure with the code:-
  1838.       for employees
  1839.          employees.cycled = "N" : update record
  1840.       next
  1841.  
  1842.                                 - 27 -
  1843. ................................................................................
  1844.  
  1845.  
  1846.  
  1847.       Data Import                UTILITY                  Data Import
  1848.  
  1849.  
  1850.       There are three Data Import routines in Easy Base. The first
  1851.       imports data from files which conform to the Xbase standard
  1852.       first introduced by Dbase. The second imports data from "Comma
  1853.       Delimited" files. This is the standard used by most sequencial
  1854.       access and non relational data systems. The third routine
  1855.       imports data from fixed length record text files. Although few
  1856.       systems actually store data as fixed length text, this is the
  1857.       format which is used by all systems to output data. You can
  1858.       therefore import data from virtually any other system by first
  1859.       reporting on it to a disk file and then importing it with the
  1860.       fixed length ASCII import routine.
  1861.  
  1862.       XBASE
  1863.  
  1864.       If the data you wish to import is in Xbase format, Easy Base
  1865.       will report the structure of the file. You can print this out
  1866.       by pressing F10. You now design a form to hold the imported
  1867.       data. The names that you give to the Easy Base fields do not
  1868.       have to be the same as the Xbase field names but they must be
  1869.       in the same order. If the Xbase fields are text then the Easy
  1870.       Base fields must be the same length. If the Xbase fields are
  1871.       numeric then the Easy Base fields must be numeric. It does not
  1872.       matter if they are different lengths and any of the three
  1873.       types, integer, fixed point or floating point can be used.
  1874.       If an Xbase field is a date field then it must be imported to
  1875.       an eight character text field in Easy Base. You can reformat it
  1876.       to an Easy Base date field after importation (See the Method -
  1877.       Data Type Conversion).  Easy Base does not support "Memo" data.
  1878.       If the Xbase file has a memo field you can still import from it
  1879.       but the memo field itself will be skipped by the import
  1880.       routine.
  1881.  
  1882.       COMMA DELIMITED
  1883.  
  1884.       To import data from comma delimited files all you have to do is
  1885.       design a form with the same number of fields as there are in
  1886.       the file to be imported. Numeric fields can be any of the three
  1887.       types and text fields should be long enough to hold the longest
  1888.       data expected in the incoming field. If any of the fields to be
  1889.       imported holds a date then it must be imported to a text field.
  1890.       You can convert it to a date later.
  1891.  
  1892.       FIXED LENGTH ASCII
  1893.  
  1894.       To import data from fixed length ASCII files you must design a
  1895.       form in which all fields are text and are exactly the same
  1896.       length and in the same order as the fields in the file to be
  1897.       imported. If the file to be imported has a header you can allow
  1898.       for this by entering the header length in bytes.
  1899.  
  1900.       If you are using the fixed length import routine to import data
  1901.       which you have output as a report from another system then
  1902.  
  1903.                                 - 28 -
  1904. ................................................................................
  1905.  
  1906.  
  1907.  
  1908.       Data Import                UTILITY                  Data Import
  1909.  
  1910.  
  1911.       please note the following points.
  1912.  
  1913.       The output report from the original system should have no
  1914.       headers, footers or left margin and there should be no spaces
  1915.       between fields.
  1916.  
  1917.       When the original system outputs the data it will add a
  1918.       carriage return and line feed sequence to the end of each
  1919.       record. When you design the form to import this data to, you
  1920.       must have a final two character text field to trap this
  1921.       sequence and maintain the same record length.  This field can
  1922.       be deleted after importation.
  1923.  
  1924.       All fields are imported as text. If any of them contain numeric
  1925.       values which you wish to convert to numeric fields you must do
  1926.       this after importation. (See Method Data Type Conversion)
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.                                 - 29 -
  1965. ................................................................................
  1966.  
  1967.  
  1968.  
  1969.       Data Type Conversion        METHOD         Data Type Conversion
  1970.  
  1971.  
  1972.       In Easy Base, modifying the structure of a data file after it
  1973.       contains data is very easy and flexible. If you select Modify
  1974.       Existing Form from the Forms menu you can add fields, delete
  1975.       fields, change field order, change field lengths and Easy Base
  1976.       will reformat your existing data automatically.
  1977.  
  1978.       You can NOT however change data types simply by changing the
  1979.       field type. If you change a field type and save the form you
  1980.       will almost certainly lose the data that was in that field.
  1981.       (Other than changing from one numeric type to another)
  1982.  
  1983.       If you work entirely within Easy Base there is no reason why
  1984.       you should ever need to change a field type. However, if you
  1985.       have imported data from Dbase or Fixed Length ASCII you may
  1986.       find yourself with numeric or date values held in text fields.
  1987.  
  1988.       The procedure for converting data from one type to another is
  1989.       as follows:-
  1990.  
  1991.       1.   Select Modify Existing Form
  1992.  
  1993.       2.   Add a new field of the desired type with a derivation
  1994.            formula such that it will derive its value from the field
  1995.            of the old type.
  1996.  
  1997.       3.   Save the form.
  1998.  
  1999.       4.   Select Modify the form again.
  2000.  
  2001.       5.   Cancel the derivation formula in the new field and delete
  2002.            the old field.
  2003.  
  2004.       6.   Re save the form.
  2005.  
  2006.  
  2007.       To derive a numeric field from a text field the derivation
  2008.       formula is simply the text field name.
  2009.  
  2010.       To derive a date field from a Dbase imported date in a text
  2011.       field called DT the formula is:-
  2012.  
  2013.       Makedate(midtext(DT,5,2),midtext(DT,7,2),midtext(DT,3,2))
  2014.  
  2015.       Version 3.10
  2016.  
  2017.       From V3.1 you can change field types between text and numeric
  2018.       and retain any numeric values that were in the field
  2019.       automatically . You still cannot change a field type from date
  2020.       or time to text or vice versa without following the above
  2021.       procedure.
  2022.  
  2023.  
  2024.  
  2025.                                 - 30 -
  2026. ................................................................................
  2027.  
  2028.  
  2029.  
  2030.       DATE                      FIELD TYPE                       DATE
  2031.  
  2032.  
  2033.       Date fields hold dates in the eight character format 11/11/94
  2034.  
  2035.       The assumed century runs from the first of January 1981 to the
  2036.       31st of december 2080.
  2037.  
  2038.       You can select whether you wish your dates to be displayed as
  2039.       day/month/year (European) or month/day/year (North American)
  2040.       from the "options" item on the utilities menu.
  2041.  
  2042.       You can perform addition and subtraction operations on date
  2043.       values in days.
  2044.  
  2045.       Ex.  System date + 30
  2046.  
  2047.       Arithmetic operations are only correct for the assumed century.
  2048.  
  2049.       Date fields are automatically checked for validity by the
  2050.       system.
  2051.  
  2052.       Easy base does not provide a ready made ten character date
  2053.       field but you can define one with the "Formatted Text" field
  2054.       type.
  2055.  
  2056.  
  2057.       See Also:-   Makedate
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.  
  2075.  
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.                                 - 31 -
  2087. ................................................................................
  2088.  
  2089.  
  2090.  
  2091.       DATETEXT                   FUNCTION                    DATETEXT
  2092.  
  2093.  
  2094.       This function returns the date parameter in the form:-
  2095.  
  2096.       14th October 1994  or
  2097.       October 14th 1994  depending on the date format selected in
  2098.                          the utilities menu.
  2099.  
  2100.  
  2101.       Ex.    datetext(system date)
  2102.  
  2103.       Ex.    datetext(invoicedate + 30)
  2104.  
  2105.       Acceptable parameters:
  2106.  
  2107.       System date
  2108.       Date field
  2109.       Makedate function
  2110.       Date expression
  2111.  
  2112.  
  2113.  
  2114.  
  2115.  
  2116.  
  2117.  
  2118.  
  2119.  
  2120.  
  2121.  
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.                                 - 32 -
  2148. ................................................................................
  2149.  
  2150.  
  2151.  
  2152.       DAYOFMONTH                 FUNCTION                  DAYOFMONTH
  2153.  
  2154.  
  2155.       This function returns the day no.(1-31) of the date parameter.
  2156.  
  2157.       Ex. dayofmonth(system date)
  2158.  
  2159.       Ex  dayofmonth(registered)
  2160.  
  2161.       Ex.
  2162.  
  2163.       if dayofmonth(system date) = 28 then
  2164.          for statements with settled = "No"
  2165.             statements.overdue = "Yes"
  2166.             update record
  2167.          next
  2168.       end if
  2169.  
  2170.       Acceptable parameters:
  2171.  
  2172.       System date
  2173.       Date field
  2174.       Makedate function
  2175.       Date expression
  2176.  
  2177.  
  2178.  
  2179.  
  2180.  
  2181.  
  2182.  
  2183.  
  2184.  
  2185.  
  2186.  
  2187.  
  2188.  
  2189.  
  2190.  
  2191.  
  2192.  
  2193.  
  2194.  
  2195.  
  2196.  
  2197.  
  2198.  
  2199.  
  2200.  
  2201.  
  2202.  
  2203.  
  2204.  
  2205.  
  2206.  
  2207.  
  2208.                                 - 33 -
  2209. ................................................................................
  2210.  
  2211.  
  2212.  
  2213.       DAYOFWEEK                  FUNCTION                   DAYOFWEEK
  2214.  
  2215.  
  2216.       This function returns the day no.(1-7) of the date parameter.
  2217.  
  2218.       Ex.  dayofweek(system date)
  2219.  
  2220.       Ex.  day = spellday(dayofweek(diary.date))
  2221.  
  2222.       Ex.  The following procedure, if called from a batch execute
  2223.       menu will only run on a Monday.
  2224.  
  2225.       declare output fields
  2226.          takings.date
  2227.          takings.dailytotal
  2228.       end
  2229.       if dayofweek(system date) = 1 then
  2230.          for takings with date in reverse order
  2231.             print list items
  2232.             if system date - takings.date > 7 then exit for
  2233.          next
  2234.       end if
  2235.  
  2236.       Acceptable parameters:
  2237.  
  2238.       System date
  2239.       Date field
  2240.       Makedate function
  2241.       Date expression
  2242.  
  2243.  
  2244.  
  2245.  
  2246.  
  2247.  
  2248.  
  2249.  
  2250.  
  2251.  
  2252.  
  2253.  
  2254.  
  2255.  
  2256.  
  2257.  
  2258.  
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.  
  2268.  
  2269.                                 - 34 -
  2270. ................................................................................
  2271.  
  2272.  
  2273.  
  2274.       DAYOFYEAR                  FUNCTION                   DAYOFYEAR
  2275.  
  2276.  
  2277.       This function returns the day no.(1-365) of the date parameter.
  2278.  
  2279.       Ex.   dayofyear(system date)
  2280.  
  2281.       Ex.   days = dayofyear(events.date)
  2282.  
  2283.       Acceptable parameters:
  2284.  
  2285.       System date
  2286.       Date field
  2287.       Makedate function
  2288.       Date expression
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.  
  2301.  
  2302.  
  2303.  
  2304.  
  2305.  
  2306.  
  2307.  
  2308.  
  2309.  
  2310.  
  2311.  
  2312.  
  2313.  
  2314.  
  2315.  
  2316.  
  2317.  
  2318.  
  2319.  
  2320.  
  2321.  
  2322.  
  2323.  
  2324.  
  2325.  
  2326.  
  2327.  
  2328.  
  2329.  
  2330.                                 - 35 -
  2331. ................................................................................
  2332.  
  2333.  
  2334.  
  2335.       DECLARE                PROCEDURE COMMAND                DECLARE
  2336.  
  2337.  
  2338.       If you write a procedure which outputs information to the
  2339.       screen, printer or a disk file you must start it by declaring
  2340.       the output fields.
  2341.  
  2342.       Ex.
  2343.       Declare output fields
  2344.          Input.name
  2345.          Customers.name:customers.address:customers.acno
  2346.          countofinvoices
  2347.       end
  2348.  
  2349.       If fields you intend to print exist in a form then declare them
  2350.       as Formname.Fieldname.  Fields from the procedures Input Screen
  2351.       are declared as Input.fieldname. Easy Base will then use the
  2352.       field definitions from the form as defaults when you create the
  2353.       Output Format for the procedure.
  2354.  
  2355.       If a field which you intend to print is to be derived during
  2356.       the procedure and does not exist in a form as "countofinvoices"
  2357.       you can give it any name you wish up to forty characters but
  2358.       the name must not contain a ".". Once you have declared fields
  2359.       you can create the Output Format.
  2360.  
  2361.       If you declare an "Ad Hoc" field such as "countovinvoices" then
  2362.       you must include it in the format in order to define its type
  2363.       and length.
  2364.  
  2365.       If you require variables to store values during a procedure but
  2366.       you will not be out-putting their values then declare them as
  2367.       variables not fields.
  2368.  
  2369.       Ex.
  2370.  
  2371.       declare variables
  2372.          count as number
  2373.          lasttype as text
  2374.       end
  2375.  
  2376.       Unprinted variables can only have one of the two types "Number"
  2377.       or "Text".
  2378.  
  2379.       Field declarations must precede Variable declarations and both
  2380.       must precede executable code.
  2381.  
  2382.  
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.  
  2391.                                 - 36 -
  2392. ................................................................................
  2393.  
  2394.  
  2395.  
  2396.       DEFAULT                    FUNCTION                     DEFAULT
  2397.  
  2398.  
  2399.       This function returns the parameter if not overridden by user
  2400.       entry.
  2401.  
  2402.  
  2403.       Ex.    Default(5)
  2404.  
  2405.       Ex.    Default(system date)
  2406.  
  2407.       Ex.    Default(lookup(stock,price))
  2408.  
  2409.       The Default function is only used in form and input screen
  2410.       field derivations - It has no meaning in procedure code.
  2411.  
  2412.       Acceptable parameters
  2413.  
  2414.       Any value, expression, field, variable or nested function of
  2415.       the same type as the field in which it is used.
  2416.  
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.  
  2423.  
  2424.  
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.  
  2438.  
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.                                 - 37 -
  2453. ................................................................................
  2454.  
  2455.  
  2456.  
  2457.       DELAY                    FIELD CONTROL                    DELAY
  2458.  
  2459.  
  2460.       The "delay" control suspends processing for a given number of
  2461.       milliseconds.
  2462.  
  2463.       Ex.
  2464.  
  2465.       A procedure screen is used from a startup Batch execute menu as
  2466.       an opening screen to an application and has the following field
  2467.       derivations
  2468.  
  2469.       1.  "Welcome to this wonderful program" [delay 1000]
  2470.  
  2471.       2.  "Copyright Fred blogs"[delay 1000]
  2472.  
  2473.       3.  "Press F2 to start"
  2474.  
  2475.       If the field colours are "text" ,"alt1" or "alt2" then the
  2476.       three fields will "Popup" with a one second delay between each.
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.  
  2488.  
  2489.  
  2490.  
  2491.  
  2492.  
  2493.  
  2494.  
  2495.  
  2496.  
  2497.  
  2498.  
  2499.  
  2500.  
  2501.  
  2502.  
  2503.  
  2504.  
  2505.  
  2506.  
  2507.  
  2508.  
  2509.  
  2510.  
  2511.  
  2512.  
  2513.                                 - 38 -
  2514. ................................................................................
  2515.  
  2516.  
  2517.  
  2518.       DELAY                  PROCEDURE COMMAND                  DELAY
  2519.  
  2520.  
  2521.       The "Delay" command suspends processing for a given number of
  2522.       milliseconds (1 - 5000).
  2523.  
  2524.       Ex.
  2525.  
  2526.       declare variables
  2527.          x as number : total as number
  2528.       end
  2529.       for customers
  2530.          customers.balance = 0
  2531.          for invoices with acno = customers.acno
  2532.             display status "Totalling invoices for" + Customers.name
  2533.             delay 200
  2534.             customers.balance = customers.balance + invoices.total
  2535.          next
  2536.          update record
  2537.       next
  2538.  
  2539.       In the above example, wherever a customer only has one or two
  2540.       invoices to total, the status display would change very
  2541.       quickly.  By including a 200 millisecond delay you can ensure
  2542.       that each customers name is on screen at least long enough to
  2543.       be read.
  2544.  
  2545.       Delay values outside of 1 - 5000 are ignored.
  2546.  
  2547.  
  2548.  
  2549.  
  2550.  
  2551.  
  2552.  
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.  
  2561.  
  2562.  
  2563.  
  2564.  
  2565.  
  2566.  
  2567.  
  2568.  
  2569.  
  2570.  
  2571.  
  2572.  
  2573.  
  2574.                                 - 39 -
  2575. ................................................................................
  2576.  
  2577.  
  2578.  
  2579.       DELETE CHOICE LISTS        UTILITY          DELETE CHOICE LISTS
  2580.  
  2581.  
  2582.       If you have Choice lists for choice fields that are no longer
  2583.       required you can delete them with this utility.
  2584.  
  2585.  
  2586.  
  2587.  
  2588.  
  2589.  
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.  
  2598.  
  2599.  
  2600.  
  2601.  
  2602.  
  2603.  
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.  
  2618.  
  2619.  
  2620.  
  2621.  
  2622.  
  2623.  
  2624.  
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.  
  2633.  
  2634.  
  2635.                                 - 40 -
  2636. ................................................................................
  2637.  
  2638.  
  2639.  
  2640.       DELETE RECORD          PROCEDURE COMMAND          DELETE RECORD
  2641.  
  2642.  
  2643.       The "Delete Record" command is used for the selective deletion
  2644.       of records in a form.
  2645.  
  2646.       Ex.
  2647.  
  2648.       for books with title = input.title
  2649.          delete record
  2650.       next
  2651.  
  2652.       This deletes the single book whose title is that entered on the
  2653.       input screen.
  2654.  
  2655.       for books with author = input.author
  2656.          delete record
  2657.       next
  2658.  
  2659.       This deletes the records of all books by the author entered on
  2660.       the input screen.
  2661.  
  2662.       When you use the "Delete Record" command it has the same effect
  2663.       as deleting a record in data entry. In other words the record
  2664.       is marked for deletion but will not actually be removed from
  2665.       the form until the next re-pack.
  2666.  
  2667.       If you use the "Delete Record" command to delete large numbers
  2668.       of records then you should pack the form afterward.
  2669.  
  2670.       If you wish to delete all records in a form use the "Clear
  2671.       records" command not the "Delete Record" command.
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.  
  2680.  
  2681.  
  2682.  
  2683.  
  2684.  
  2685.  
  2686.  
  2687.  
  2688.  
  2689.  
  2690.  
  2691.  
  2692.  
  2693.  
  2694.  
  2695.  
  2696.                                 - 41 -
  2697. ................................................................................
  2698.  
  2699.  
  2700.  
  2701.       DERIVE OFF             PROCEDURE COMMAND             DERIVE OFF
  2702.  
  2703.  
  2704.       Whenever an Easy Base procedure adds or updates a record then
  2705.       by default it checks the derivations of all fields during an
  2706.       add operation and any fields that are affected by an update
  2707.       operation. In other words, if you update the netprice field in
  2708.       a stock form and that form has derived fields for VAT and
  2709.       grossprice then those fields will also be updated.
  2710.  
  2711.       If the procedure adds or updates all fields then this process
  2712.       is superfluous and simply slows the procedure. You can disable
  2713.       form derivation checking with the "Derive Off" command.
  2714.  
  2715.       derive off
  2716.       for stock with item = input.item
  2717.          copy all from input
  2718.          update record
  2719.       next
  2720.  
  2721.       In the above example a stock form has several derived fields
  2722.       but the input screen also does the same derivations. There is
  2723.       therefore no need to re-check them when the record is updated.
  2724.  
  2725.       As a general rule, in procedures which add or update records
  2726.       from an input screen, you should derive all fields on the input
  2727.       screen rather than during the update process. The user will not
  2728.       notice the time taken to derive fields while he is filling them
  2729.       in but he will notice the time taken to derive them after he
  2730.       has pressed F2
  2731.  
  2732.       There is no corresponding "Derive On" command. Derivation
  2733.       checking is automatically turned back on at the end of the
  2734.       loop to which is prefixed by the "Derive Off" command. If you
  2735.       require derivation checking to be off for more than one loop in
  2736.       a procedure then you must issue the command before each loop.
  2737.  
  2738.  
  2739.       Note:-
  2740.  
  2741.       If the "Derive Off" command is not issued before a loop then
  2742.       form level derivations override procedure derivations. This is
  2743.       not normally a problem, but can be if you try to change the
  2744.       case of a field for printing.
  2745.  
  2746.       For customers
  2747.          customers.name = proper(customers.name)
  2748.          print list items
  2749.       next
  2750.  
  2751.       If the "Name" field on the "Customers" form is derived as
  2752.       Upper(name) then the procedure will print the customers names
  2753.       in upper case.  You can overcome the problem either by
  2754.       cancelling the field derivation or by transferring the
  2755.       customers name to a variable and converting that to proper.
  2756.  
  2757.                                 - 42 -
  2758. ................................................................................
  2759.  
  2760.  
  2761.  
  2762.       DISPLAY STATUS         PROCEDURE COMMAND         DISPLAY STATUS
  2763.  
  2764.  
  2765.       If you write a procedure which has no output then Easy Base
  2766.       will display a "Running" flash at the top right hand side of
  2767.       the screen. For procedures which only take a few seconds to run
  2768.       this is sufficient to let the operator know that something is
  2769.       happening. For procedures that take some time to complete you
  2770.       should include a status display showing the progress of the
  2771.       procedure. A status display not only allays the nagging
  2772.       suspicion that the system has hung up but also allows the
  2773.       operator to estimate how long it will take.
  2774.  
  2775.       To create a status display just issue the command "Display
  2776.       Status" followed by a message composed of text in quotation
  2777.       marks and fields or variables concatenated by the + sign.
  2778.  
  2779.       Ex.
  2780.  
  2781.  
  2782.       declare variables
  2783.          x as number : y as number
  2784.       end
  2785.       for employees with taxcode = input.oldtaxcode
  2786.          y = total copies :exit for    'get copies to y for display
  2787.       next
  2788.       for employees with taxcode = input.oldtaxcode
  2789.          x = x + 1
  2790.          display status "Updating Record" + x + "of" + y
  2791.          employees.taxcode = input.newtaxcode
  2792.          update record
  2793.       next
  2794.  
  2795.       The status line is displayed centrally in a small window when
  2796.       the procedure runs. A Status line can have a maximum of 68
  2797.       characters. If you create a status line of more than 68
  2798.       characters then it will be cut short to that length.
  2799.  
  2800.       If you need to display counters in two nested loops then write
  2801.       the full display line in the outer loop and "display status"
  2802.       with no parameters in the inner loop.
  2803.  
  2804.       for customers
  2805.          x = x + 1
  2806.          - loop statements -
  2807.          display status "Checking Invoice" + y + "of customer" + x
  2808.          for invoices with customer = customers.name
  2809.             y = y + 1
  2810.             - Loop Statements -
  2811.             display status
  2812.          next
  2813.       next
  2814.  
  2815.  
  2816.  
  2817.  
  2818.                                 - 43 -
  2819. ................................................................................
  2820.  
  2821.  
  2822.  
  2823.       DO..LOOP               PROCEDURE COMMAND               DO..LOOP
  2824.  
  2825.  
  2826.       The "Do" loop structure is used in the Easy Base Procedure code
  2827.       to repeat a series of commands or statements. Whenever a
  2828.       procedure reaches a "Do" command it repeats all the statements
  2829.       between the "Do" and the "Loop" statements until the loop is
  2830.       broken by an "Exit Do" command.
  2831.  
  2832.       Ex.
  2833.  
  2834.       The following code fragment prints 10 copies of the top fifty
  2835.       best selling items in a "stock" form.
  2836.  
  2837.  
  2838.       .........................code............................
  2839.       declare output fields
  2840.          stock.item : stock.sales : today
  2841.       end
  2842.       Declare variables
  2843.          copies as number : items as number
  2844.       end
  2845.       today = system date
  2846.       do
  2847.          copies = copies + 1 :items = 0
  2848.          if copies = 11 then exit do
  2849.          bold on
  2850.          print report header
  2851.          bold off
  2852.          for stock with sales in reverse order
  2853.             items = items + 1
  2854.             if items = 51 then exit for
  2855.             print list items
  2856.          next
  2857.          bold on : print report footer : bold off
  2858.          page feed
  2859.       loop
  2860.       ............................format.....................
  2861.       .Report Header
  2862.          ═════════════════════════════════════════════════════
  2863.          Top 50 Best Selling Items               {today field}
  2864.          ═════════════════════════════════════════════════════
  2865.       .list items
  2866.             {stock.item field}        {stock.sales field}
  2867.       .Report Footer
  2868.          ═════════════════════════════════════════════════════
  2869.       .end
  2870.  
  2871.  
  2872.  
  2873.  
  2874.  
  2875.  
  2876.  
  2877.  
  2878.  
  2879.                                 - 44 -
  2880. ................................................................................
  2881.  
  2882.  
  2883.  
  2884.       DUPLICATE PREVENTION        METHOD         DUPLICATE PREVENTION
  2885.  
  2886.  
  2887.       1.  Where "Blank" values are acceptable.
  2888.  
  2889.       Quite often you will come across a situation where a field must
  2890.       not have duplicate entries but can still be left blank. You
  2891.       cannot define this field as unique because that would prevent
  2892.       more than one blank entry.  A good example of such a situation
  2893.       is in the "Menus Form" of Easy Base. The definition and unique
  2894.       field is the "Menu Title" but no two records may have the same
  2895.       entry in the sign on "Password" field.
  2896.  
  2897.       To prevent duplicate entries other than blanks you must enter a
  2898.       relationship between the form and itself with the field to be
  2899.       tested as the related field in both primary and secondary
  2900.       forms.
  2901.  
  2902.       The field is then derived as :-
  2903.  
  2904.       If(lookup(menus,password) <> blank,blank[beepDuplicate Password
  2905.                !],password)
  2906.  
  2907.       2.   When entering records via procedures.
  2908.  
  2909.       When you use a procedure to enter a new record to a form it is
  2910.       not automatically checked as "Unique".   To ensure that
  2911.       duplicate entries are not entered via procedures you must check
  2912.       that the data entered on the procedures input screen is unique
  2913.       to the form you are about to enter it to before running the
  2914.       procedure.  For example: If you were about to enter a record to
  2915.       the "Manufacturers" form in which the "Name" field was unique
  2916.       then the "Name" field on the input screen would be derived:-
  2917.  
  2918.          if(lookup(manufacturers,name) <> blank,blank[beepDuplicate
  2919.                     Name !cursor name],name)
  2920.  
  2921.  
  2922.  
  2923.  
  2924.  
  2925.  
  2926.  
  2927.  
  2928.  
  2929.  
  2930.  
  2931.  
  2932.  
  2933.  
  2934.  
  2935.  
  2936.  
  2937.  
  2938.  
  2939.  
  2940.                                 - 45 -
  2941. ................................................................................
  2942.  
  2943.  
  2944.  
  2945.       ESCAPE ON/OFF          PROCEDURE COMMAND          ESCAPE ON/OFF
  2946.  
  2947.  
  2948.       When a procedure is running in Easy Base, it cannot, by
  2949.       default, be interrupted. If your procedure simply lists data to
  2950.       the screen then the end user may not need to see the entire
  2951.       output. You can allow the user to terminate a procedure
  2952.       prematurely with the "Escape On" command.
  2953.  
  2954.       If a procedure performs several tasks, you can selectively
  2955.       enable and disable the Escape Key with the commands "Escape On"
  2956.       and "Escape" Off"
  2957.  
  2958.       Ex.
  2959.  
  2960.       For newpayscales
  2961.          print list items
  2962.       next
  2963.       escape off
  2964.       for newpayscales
  2965.          for employees with scale = newpayscales.scale
  2966.             employees.rate = newpayscales.rate
  2967.             update record
  2968.          next
  2969.       next
  2970.       escape on
  2971.       for employees
  2972.          print newpay
  2973.       next
  2974.  
  2975.       In the above example a procedure lists new pay scales, updates
  2976.       the "Employees" form with the new pay rate and then lists the
  2977.       employees with their new rates.
  2978.  
  2979.       While the procedure is running the operator can terminate it
  2980.       during either of the lists but he cannot terminate it during
  2981.       the process of updating the "Employees" form.
  2982.  
  2983.  
  2984.  
  2985.  
  2986.  
  2987.  
  2988.  
  2989.  
  2990.  
  2991.  
  2992.  
  2993.  
  2994.  
  2995.  
  2996.  
  2997.  
  2998.  
  2999.  
  3000.  
  3001.                                 - 46 -
  3002. ................................................................................
  3003.  
  3004.  
  3005.  
  3006.       EXIT BATCH MENU        PROCEDURE COMMAND        EXIT BATCH MENU
  3007.  
  3008.  
  3009.       The "Exit Batch Menu" command terminates a current Batch Menu
  3010.       and returns control to the menu which called it.
  3011.  
  3012.       Ex.
  3013.  
  3014.       An application starts with a batch menu which calls a second
  3015.       batch menu which performs regular daily tasks. It then calls
  3016.       the main user menu. If the application is exited after the
  3017.       daily tasks batch menu has been completed then you will not
  3018.       wish to re-run the daily tasks when the application is
  3019.       restarted on the same day. To prevent this create a form
  3020.       "tasksdone" with a single field "date" and enter a single
  3021.       record with yesterdays date.
  3022.  
  3023.       The first procedure on the daily tasks batch menu would then be
  3024.  
  3025.       for tasksdone
  3026.          if tasksdone.date = system date then
  3027.             exit batch menu
  3028.          else
  3029.             tasksdone.date = system date
  3030.             update record
  3031.          end if
  3032.       next
  3033.  
  3034.  
  3035.  
  3036.  
  3037.  
  3038.  
  3039.  
  3040.  
  3041.  
  3042.  
  3043.  
  3044.  
  3045.  
  3046.  
  3047.  
  3048.  
  3049.  
  3050.  
  3051.  
  3052.  
  3053.  
  3054.  
  3055.  
  3056.  
  3057.  
  3058.  
  3059.  
  3060.  
  3061.  
  3062.                                 - 47 -
  3063. ................................................................................
  3064.  
  3065.  
  3066.  
  3067.       EXIT PROCEDURE         PROCEDURE COMMAND         EXIT PROCEDURE
  3068.  
  3069.  
  3070.       The "Exit Procedure" command terminates a procedure.
  3071.  
  3072.       Ex.
  3073.  
  3074.       if input.codeword <> "fred" then exit procedure
  3075.       for staffconfidential with name = input.name
  3076.          print list items
  3077.       next
  3078.  
  3079.  
  3080.       If the procedure has a repeating input screen then this is
  3081.       cancelled by the "Exit Procedure" command.
  3082.  
  3083.  
  3084.  
  3085.  
  3086.  
  3087.  
  3088.  
  3089.  
  3090.  
  3091.  
  3092.  
  3093.  
  3094.  
  3095.  
  3096.  
  3097.  
  3098.  
  3099.  
  3100.  
  3101.  
  3102.  
  3103.  
  3104.  
  3105.  
  3106.  
  3107.  
  3108.  
  3109.  
  3110.  
  3111.  
  3112.  
  3113.  
  3114.  
  3115.  
  3116.  
  3117.  
  3118.  
  3119.  
  3120.  
  3121.  
  3122.  
  3123.                                 - 48 -
  3124. ................................................................................
  3125.  
  3126.  
  3127.  
  3128.       FIXED POINT               FIELD TYPE                FIXED POINT
  3129.  
  3130.  
  3131.       Fixed point fields can display up to 14 digits. They use the
  3132.       comma for thousands separation and the full stop for decimal
  3133.       separation.
  3134.  
  3135.       There are no rounding errors with fixed point fields.
  3136.  
  3137.       See - Operators arithmetic
  3138.  
  3139.  
  3140.  
  3141.  
  3142.  
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  
  3148.  
  3149.  
  3150.  
  3151.  
  3152.  
  3153.  
  3154.  
  3155.  
  3156.  
  3157.  
  3158.  
  3159.  
  3160.  
  3161.  
  3162.  
  3163.  
  3164.  
  3165.  
  3166.  
  3167.  
  3168.  
  3169.  
  3170.  
  3171.  
  3172.  
  3173.  
  3174.  
  3175.  
  3176.  
  3177.  
  3178.  
  3179.  
  3180.  
  3181.  
  3182.  
  3183.  
  3184.                                 - 49 -
  3185. ................................................................................
  3186.  
  3187.  
  3188.  
  3189.       FLOATING POINT            FIELD TYPE             FLOATING POINT
  3190.  
  3191.  
  3192.       Floating point fields can display up to 14 digits. They do not
  3193.       have a thousands separator. They are left justified.
  3194.  
  3195.  
  3196.  
  3197.  
  3198.  
  3199.  
  3200.  
  3201.  
  3202.  
  3203.  
  3204.  
  3205.  
  3206.  
  3207.  
  3208.  
  3209.  
  3210.  
  3211.  
  3212.  
  3213.  
  3214.  
  3215.  
  3216.  
  3217.  
  3218.  
  3219.  
  3220.  
  3221.  
  3222.  
  3223.  
  3224.  
  3225.  
  3226.  
  3227.  
  3228.  
  3229.  
  3230.  
  3231.  
  3232.  
  3233.  
  3234.  
  3235.  
  3236.  
  3237.  
  3238.  
  3239.  
  3240.  
  3241.  
  3242.  
  3243.  
  3244.  
  3245.                                 - 50 -
  3246. ................................................................................
  3247.  
  3248.  
  3249.  
  3250.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3251.  
  3252.  
  3253.       The "For" command initiates loops which load records from forms
  3254.       for processing. All statements between the "For" and the "Next"
  3255.       commands are repeated for each record selected.
  3256.  
  3257.       Ex.
  3258.  
  3259.       For Videos
  3260.          If Videos.price = 2.00 then Videos.price = 2.50
  3261.          update record
  3262.       next
  3263.  
  3264.       In the above example each record in the "Videos" form is loaded
  3265.       into memory - the price field is checked and if it is 2.00 then
  3266.       it is altered to 2.50 - the record is then updated on disk.
  3267.  
  3268.       "For" loops can be nested to any depth.
  3269.  
  3270.       Ex.
  3271.  
  3272.       for videoprices
  3273.          for videos
  3274.             if videos.price = videoprices.price then
  3275.                print list items
  3276.             end if
  3277.          next
  3278.       next
  3279.  
  3280.       In the above example the outer loop loads each record from the
  3281.       "Videoprices" form.  While each of these is in memory it then
  3282.       loads each record from the "Videos" form, tests to see if the
  3283.       price field in "Videos" is the same as the price field in
  3284.       "Videoprices" and if so prints the list items section of the
  3285.       report format (containing the video title field) thus grouping
  3286.       all video titles by price.
  3287.  
  3288.       If a "For" loop is unqualified as above then every record is
  3289.       processed starting at one and advancing in sequence. "For"
  3290.       loops can be qualified in several ways in order to select
  3291.       records in other orders or groups. The following qualifications
  3292.       are available:-
  3293.  
  3294.       For (form) with (fieldname) in order
  3295.       For (form) with (fieldname) in reverse order
  3296.       For (form) with (fieldname) =  (value)
  3297.       For (form) with (fieldname) >  (value)
  3298.       For (form) with (fieldname) <  (value)
  3299.       For (form) with (fieldname) >= (value)
  3300.       For (form) with (fieldname) <= (value)
  3301.       For (form) new record
  3302.  
  3303.       With the exception of the "New Record" qualification, all
  3304.       accept the suffix "Unique" and an "Alias" for the form name.
  3305.  
  3306.                                 - 51 -
  3307. ................................................................................
  3308.  
  3309.  
  3310.  
  3311.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3312.  
  3313.  
  3314.       If a "For" loop is qualified by "in order" or "in reverse
  3315.       order" then the records are selected in alphabetical or reverse
  3316.       alphabetical order if the selection field is text, and in
  3317.       numeric or reverse numeric order if the selection field is
  3318.       numeric.
  3319.  
  3320.       Ex.
  3321.  
  3322.       for books with title in order
  3323.          print list items
  3324.       next
  3325.  
  3326.       Ex.
  3327.  
  3328.       for salesmen with monthlysales in reverse order
  3329.          print list items
  3330.       next
  3331.  
  3332.       If a "For" loop is qualified by "in order unique" or "in
  3333.       reverse order unique" then records will be selected in order or
  3334.       in reverse order as above. However, where there are multiple
  3335.       occurrence of the same field value a "unique" loop will only
  3336.       select the first occurrence of each value if the loop is in
  3337.       order or the last occurrence if the loop is in reverse order.
  3338.  
  3339.       Ex.
  3340.  
  3341.       for books with category in order unique
  3342.          count = count + 1
  3343.          print list items
  3344.       next
  3345.       print categorycount
  3346.  
  3347.       This example prints and counts the different categories in the
  3348.       "books" form.
  3349.  
  3350.       Ex.
  3351.  
  3352.       for theatreseats with price in reverse order unique
  3353.          for seatprices new record
  3354.             seatprices.price = theatreseats.price
  3355.          next
  3356.       next
  3357.  
  3358.       The above example selects one example only of each seat price
  3359.       in an existing "theatreseats" form in descending price order
  3360.       and enters a new record in the new "seatprices" form.
  3361.  
  3362.  
  3363.  
  3364.  
  3365.  
  3366.  
  3367.                                 - 52 -
  3368. ................................................................................
  3369.  
  3370.  
  3371.  
  3372.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3373.  
  3374.  
  3375.       If a "For" loop is qualified by a "Fieldname = " condition then
  3376.       only the record or records where the field contents match the
  3377.       condition will be selected.
  3378.  
  3379.       Ex.
  3380.  
  3381.       for books with category = "fiction"
  3382.          print list items
  3383.       next
  3384.  
  3385.       This example prints all books which have the category "fiction"
  3386.  
  3387.       Ex.
  3388.  
  3389.       For customers with acno = input.acno
  3390.          creditlimit = input.creditlimit
  3391.          update record
  3392.       next
  3393.  
  3394.       In this example the procedure has an input screen where the
  3395.       operator enters a customers account number and new credit
  3396.       limit. On pressing F2 the procedure finds the single record in
  3397.       the "Customers" form which has the input account number and
  3398.       updates the "creditlimit" field.
  3399.  
  3400.  
  3401.  
  3402.  
  3403.  
  3404.  
  3405.  
  3406.  
  3407.  
  3408.  
  3409.  
  3410.  
  3411.  
  3412.  
  3413.  
  3414.  
  3415.  
  3416.  
  3417.  
  3418.  
  3419.  
  3420.  
  3421.  
  3422.  
  3423.  
  3424.  
  3425.  
  3426.  
  3427.  
  3428.                                 - 53 -
  3429. ................................................................................
  3430.  
  3431.  
  3432.  
  3433.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3434.  
  3435.  
  3436.       If a "For" loop is qualified by a "with (fieldname) > " or
  3437.       "with (fieldname) >= " condition then records are selected in
  3438.       order like the "with (fieldname) in order" qualification but
  3439.       starting with the first record where the field contents match
  3440.       the condition value rather than the first record.
  3441.  
  3442.       Similarly the qualifications "with (fieldname) < " and "with
  3443.       (fieldname) <= " select records in reverse order but starting
  3444.       with the last record to match the condition value.
  3445.  
  3446.       In case you are new to progamming it should be pointed out that
  3447.       the relational operators >, <, >= and <= can be applied to text
  3448.       as well as to numbers. When they are applied to text they
  3449.       relate to the text's alphabetical order.
  3450.  
  3451.       These four qualifications provide the means to select any
  3452.       subset of records which has a range of values in a particular
  3453.       field.
  3454.  
  3455.       Ex.
  3456.  
  3457.       for pupils with age > 6
  3458.          if pupils.age = 12 then exit for
  3459.          print list items
  3460.       next
  3461.  
  3462.       This example prints the names of all pupils between the ages of
  3463.       seven and eleven. The "For" qualification starts selection in
  3464.       numeric order of age starting at seven and the "Exit for"
  3465.       command terminates the loop when the first pupil aged twelve is
  3466.       loaded.
  3467.  
  3468.       Ex.
  3469.  
  3470.       A "Videos" form has a compound index field called "catorder"
  3471.       which is derived by joining the text of the "category" and
  3472.       "title" fields. The following procedure selects all the videos
  3473.       which have the category entered on the input screen and lists
  3474.       them with the title in alphabetic order.
  3475.  
  3476.       for videos with catorder >= input.category
  3477.          if videos.category > input.category then exit for
  3478.          print list items
  3479.       next
  3480.  
  3481.       Ex.
  3482.  
  3483.       for vehicles with seats > 4 unique
  3484.          count = count + 1
  3485.       next
  3486.  
  3487.       "count" returns the number of different seat capacities > 4
  3488.  
  3489.                                 - 54 -
  3490. ................................................................................
  3491.  
  3492.  
  3493.  
  3494.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3495.  
  3496.  
  3497.       If a "For" loop is qualified by "new record" then no records
  3498.       are selected from the form. Instead, a new blank record is
  3499.       created at the "For" command, all statements between the "For"
  3500.       and "Next" commands apply to this new record and it is entered
  3501.       to the form at the "Next" command.
  3502.  
  3503.       Ex.
  3504.  
  3505.       for books new record
  3506.          books.dateinstock = system date
  3507.          copy all from input
  3508.       next
  3509.  
  3510.       This example enters a new record to the "Books" form making the
  3511.       "dateinstock" field equal the system date and copying all other
  3512.       fields from the procedures input screen.
  3513.  
  3514.       Ex.
  3515.  
  3516.       declare variables
  3517.         hourcount as number
  3518.       end
  3519.       '..............clear last wages
  3520.       clear records from wagelist
  3521.       '..........count employees hours from timesheet...
  3522.       for employees
  3523.          hourcount = 0
  3524.          for timesheet with worksno = employees.worksno
  3525.             hourcount = hourcount + timesheet.hours
  3526.          next
  3527.          for wagelist new record
  3528.             wagelist.worksno = employees.worksno
  3529.             wagelist.name = employees.name
  3530.             wagelist.hours = hourcount
  3531.             wagelist.grosswage = employees.wagerate * hourcount
  3532.          next
  3533.       next
  3534.       '.................print the wages list
  3535.       for wagelist with worksno in order
  3536.          print list items
  3537.       next
  3538.  
  3539.       This procedure starts by erasing the present contents of the
  3540.       "wagelist" form. It then selects each record from the
  3541.       "employees" form, counts all entries in the "timesheet" form
  3542.       for the employee and enters a new record in the "wagelist"
  3543.       form. Finally it prints the new wage list.
  3544.  
  3545.  
  3546.  
  3547.  
  3548.  
  3549.  
  3550.                                 - 55 -
  3551. ................................................................................
  3552.  
  3553.  
  3554.  
  3555.       FOR..NEXT              PROCEDURE COMMAND              FOR..NEXT
  3556.  
  3557.  
  3558.       Occasionally you may need to nest a "For" loop of a form within
  3559.       another "For" loop of the same form. If you do this, then in
  3560.       order to differentiate between the fields in the outer and
  3561.       inner loops you must allocate an "alias" name to the form in
  3562.       one of the loops. When you allocate an alias to a form name
  3563.       then all the fields of the form can also be referenced by the
  3564.       alias name.
  3565.  
  3566.       Ex.
  3567.       .......................procedure code...........
  3568.       declare output fields
  3569.          males : females : pupils.age
  3570.       end
  3571.       for pupils with age in order unique
  3572.          males = 0 : females = 0
  3573.          for pupils alias agegroups with age = pupils.age
  3574.             if agegroups.sex = "male" then
  3575.                males = males + 1
  3576.             else
  3577.                females = females + 1
  3578.             end if
  3579.          next
  3580.          print list items
  3581.       next
  3582.       ....................output format......................
  3583.       .list items
  3584.       There are {males} males and {females} females aged {pupils.age}
  3585.       .end
  3586.  
  3587.  
  3588.       This example counts and prints the number of male and female
  3589.       pupils in each age group.
  3590.  
  3591.       If you intend to print fields from one of the nested loops as
  3592.       the "Age" field above then you should give the alias name to
  3593.       the other loop. You can only declare an output field with the
  3594.       real form name. If you have to print fields from both loops
  3595.       then you must declare an "Ad Hoc" field and pass the alias
  3596.       fields contents to it for printing.
  3597.  
  3598.       If you need to exclude individual or groups of records from
  3599.       selection just use the "Skip Record" or "Skip Group" command.
  3600.  
  3601.       Ex.
  3602.  
  3603.       for videos with category in order
  3604.          if videos.category = "Cartoon" then skip group
  3605.          print list items
  3606.       next
  3607.  
  3608.  
  3609.  
  3610.  
  3611.                                 - 56 -
  3612. ................................................................................
  3613.  
  3614.  
  3615.  
  3616.       FORM LETTERS                METHOD                 FORM LETTERS
  3617.  
  3618.  
  3619.       To print form letters (circulars) with a different address and
  3620.       salutation for each entry in an address form simply type the
  3621.       entire letter between the .List Items and .End of the output
  3622.       format.
  3623.  
  3624.       .........................procedure code........
  3625.       Declare output fields
  3626.          Addr.name : Addr.street : Addr.town
  3627.          Addr.salutation
  3628.          date
  3629.       end
  3630.       date = datetext(system date)
  3631.       for addr
  3632.          print list items
  3633.          page feed
  3634.       next
  3635.  
  3636.       .........................output format........
  3637.       .List Items
  3638.                                              My street
  3639.                                              My county
  3640.                                              {date field  }
  3641.  
  3642.  
  3643.       {Addr.name field    }
  3644.       {Addr.street field  }
  3645.       {Addr.town field    }
  3646.  
  3647.  
  3648.       Dear {Addr.salutation},
  3649.  
  3650.           You are invited................................
  3651.       ...................................................
  3652.       ...................................................
  3653.       ..........................................
  3654.  
  3655.       Yours faithfully,
  3656.  
  3657.  
  3658.  
  3659.       Fred A Blogs
  3660.       .End
  3661.  
  3662.       Although this is the fastest way to produce a short form
  3663.       letter, the Format Editor is not the nicest place to write
  3664.       text. If you want the benefits of word wrap and spell checking
  3665.       then you can create a form in which to write the letter. Create
  3666.       text block fields to hold a page of text and a name field so
  3667.       that you can store many different letters and print them with
  3668.       the same procedure. If your letters are to be more than one
  3669.       page long then put the same name on each page.
  3670.  
  3671.  
  3672.                                 - 57 -
  3673. ................................................................................
  3674.  
  3675.  
  3676.  
  3677.       FORM LETTERS                METHOD                 FORM LETTERS
  3678.  
  3679.  
  3680.       To print the form letters from the "Letters" form your
  3681.       procedure must now have an input screen which looks up the name
  3682.       of the letter to be printed.
  3683.  
  3684.       '............................CODE.....................
  3685.       declare output fields
  3686.          addr.name : addr.street : addr.town :addr.salutation
  3687.          date :letters.block1 :letters.block2 :letters.block3
  3688.       end
  3689.       declare variables
  3690.          page as number
  3691.       end
  3692.       date = datetext(system date)
  3693.       for addr
  3694.          page = 0
  3695.          for letters with name = input.name
  3696.             page = page + 1
  3697.             if page = 1 then print list items
  3698.             if page > 1 then print extra
  3699.             page feed
  3700.          next
  3701.       next
  3702.  
  3703.       The output format is similar to that shown on the previous page
  3704.       but the text in the .list items section is replaced by the text
  3705.       block fields Letters.block1 ,letters.block2 and letters.block3
  3706.       and an additional section .extra is added which has the same
  3707.       text block fields but no address or salutation.
  3708.  
  3709.  
  3710.  
  3711.  
  3712.  
  3713.  
  3714.  
  3715.  
  3716.  
  3717.  
  3718.  
  3719.  
  3720.  
  3721.  
  3722.  
  3723.  
  3724.  
  3725.  
  3726.  
  3727.  
  3728.  
  3729.  
  3730.  
  3731.  
  3732.  
  3733.                                 - 58 -
  3734. ................................................................................
  3735.  
  3736.  
  3737.  
  3738.       FORMATTED TEXT            FIELD TYPE             FORMATTED TEXT
  3739.  
  3740.  
  3741.       If you define a field with the type "formatted text" a window
  3742.       opens up in which you enter the formatting characters. The
  3743.       characters which are to be entered by the user are shown as
  3744.       question marks. Any other characters which you enter become
  3745.       permanent fixtures in the field. The "formatted text" field can
  3746.       be up to twenty characters long and can be used for dates,
  3747.       national insurance numbers etc.
  3748.  
  3749.       Formatted text fields should not be derived.
  3750.  
  3751.  
  3752.  
  3753.  
  3754.  
  3755.  
  3756.  
  3757.  
  3758.  
  3759.  
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.  
  3766.  
  3767.  
  3768.  
  3769.  
  3770.  
  3771.  
  3772.  
  3773.  
  3774.  
  3775.  
  3776.  
  3777.  
  3778.  
  3779.  
  3780.  
  3781.  
  3782.  
  3783.  
  3784.  
  3785.  
  3786.  
  3787.  
  3788.  
  3789.  
  3790.  
  3791.  
  3792.  
  3793.  
  3794.                                 - 59 -
  3795. ................................................................................
  3796.  
  3797.  
  3798.  
  3799.       GLOBAL DEFAULTS             METHOD              GLOBAL DEFAULTS
  3800.  
  3801.  
  3802.       In many instances, an application will use the same default
  3803.       values in many procedures and field derivations. If you
  3804.       "hardwire" these as constants into your procedures and code
  3805.       then they will all have to be changed when the default value
  3806.       changes.
  3807.  
  3808.       Easy Base is supplied with a single global defaults form for
  3809.       VAT rates but you can create your own for any particular
  3810.       application.
  3811.  
  3812.       For instance, should you write a payroll system you would wish
  3813.       to be able to update the tax rates and bands globally
  3814.       throughout your application when they change.
  3815.  
  3816.       To do this, create a form to hold all the global defaults. In
  3817.       addition to the default fields add a single character text
  3818.       field derived "X" and index it. You then enter a single record
  3819.       with all the default values. The "X" field is there to create
  3820.       an artificial relationship between any input screen and the
  3821.       defaults form in order to lookup defaults.
  3822.  
  3823.       Wherever you need one or more global defaults in an input
  3824.       screen you simply add an invisible "x" field and enter a
  3825.       relationship between the procedure and the defaults form
  3826.       linking the "x" fields.
  3827.  
  3828.       The field "Tax" can now be derived:-
  3829.  
  3830.          taxablepay * lookup(defaults,taxrate)
  3831.  
  3832.       Similarly, you can pre load variables in procedure code for the
  3833.       default values:-
  3834.  
  3835.       Declare variables
  3836.         Taxrate1 as number:Taxrate2 as number
  3837.         Taxband1 as number:Taxband2 as number
  3838.       end
  3839.       for defaults
  3840.         Taxrate1 = defaults.taxrate1 :Taxrate2 = defaults.taxrate2
  3841.         Taxband1 = defaults.taxband1 :Taxband2 = defaults.taxband2
  3842.       next
  3843.  
  3844.       When the taxrates change you only have to alter them once in
  3845.       the Defaults form.
  3846.  
  3847.  
  3848.  
  3849.  
  3850.  
  3851.  
  3852.  
  3853.  
  3854.  
  3855.                                 - 60 -
  3856. ................................................................................
  3857.  
  3858.  
  3859.  
  3860.       GLOBAL NUMBER            SYSTEM VALUE             GLOBAL NUMBER
  3861.  
  3862.  
  3863.       The variables you create in Easy Base procedures are local
  3864.       variables - they cease to exist when the procedure ends. So
  3865.       that you can pass messages between procedures Easy base
  3866.       provides a single global variable "Global Number".  Once you
  3867.       allocate a value to "Global Number" that value remains
  3868.       unchanged (even if your computer has been turned off) until you
  3869.       allocate another value to it. You can of course pass many
  3870.       messages between procedures simply by entering records in forms
  3871.       and re-reading them but using "Global Number" is much quicker.
  3872.  
  3873.       The following example uses "Global Number" to make access to a
  3874.       user menu restricted by password.
  3875.  
  3876.       Two procedures are defined. The first, "getpassword" has a
  3877.       password field on its input screen and the following code:-
  3878.  
  3879.       if input.password = "gingerbread" then
  3880.          global number = 1
  3881.       else
  3882.          global number = 0
  3883.       end if
  3884.  
  3885.       The second procedure "checkpassword" has the following code:-
  3886.  
  3887.       if global number <> 1 then exit batch menu
  3888.       global number = 0
  3889.  
  3890.       The open access menu system has an item for the restricted menu
  3891.       but instead of calling it direct it calls the menu "Password"
  3892.       which is a batch execute menu with the items
  3893.  
  3894.       run procedure ----  getpassword
  3895.       run procedure ----  checkpassword
  3896.       user menu     ----  restricted
  3897.  
  3898.       If the password "gingerbread" has not been entered in the
  3899.       "getpassword" input screen then "checkpassword" will return
  3900.       control to the original menu.
  3901.  
  3902.  
  3903.  
  3904.  
  3905.  
  3906.  
  3907.  
  3908.  
  3909.  
  3910.  
  3911.  
  3912.  
  3913.  
  3914.  
  3915.  
  3916.                                 - 61 -
  3917. ................................................................................
  3918.  
  3919.  
  3920.  
  3921.       GOTO (FIELD) NEXT      DERIVATION PREFIX      GOTO (FIELD) NEXT
  3922.  
  3923.  
  3924.       In an Easy Base form or procedure input screen the cursor moves
  3925.       from field to field in the default order top left to bottom
  3926.       right when you press the Return key. You can alter this default
  3927.       order by deriving any field with "Goto (fieldname) next". If
  3928.       the field from which you wish to redirect the cursor already
  3929.       has a derivation formula you simply add the "Goto - Next" as a
  3930.       prefix.
  3931.  
  3932.       Ex.
  3933.  
  3934.       goto price next
  3935.  
  3936.       goto item next default(lookup(stock,name))
  3937.  
  3938.       Cursor redirection with the "Goto - next" derivation only
  3939.       occurs when the Return key is pressed it is not activated if
  3940.       you move the cursor with the directional arrow keys.
  3941.  
  3942.  
  3943.       Note: You can only have one prefix on any one field derivation.
  3944.  
  3945.  
  3946.  
  3947.  
  3948.  
  3949.  
  3950.  
  3951.  
  3952.  
  3953.  
  3954.  
  3955.  
  3956.  
  3957.  
  3958.  
  3959.  
  3960.  
  3961.  
  3962.  
  3963.  
  3964.  
  3965.  
  3966.  
  3967.  
  3968.  
  3969.  
  3970.  
  3971.  
  3972.  
  3973.  
  3974.  
  3975.  
  3976.  
  3977.                                 - 62 -
  3978. ................................................................................
  3979.  
  3980.  
  3981.  
  3982.       HOURS                      FUNCTION                       HOURS
  3983.  
  3984.  
  3985.       This function returns the hour ( 1 to 23) of the time parameter
  3986.  
  3987.       Ex.  Hour(system time)
  3988.  
  3989.       Ex.
  3990.  
  3991.       Labourcharge = (hours(endtime)-hours(starttime))* rate
  3992.  
  3993.  
  3994.       Acceptable parameters:
  3995.  
  3996.       System time
  3997.       Time field
  3998.       Maketime function
  3999.       Time expression
  4000.  
  4001.  
  4002.  
  4003.  
  4004.  
  4005.  
  4006.  
  4007.  
  4008.  
  4009.  
  4010.  
  4011.  
  4012.  
  4013.  
  4014.  
  4015.  
  4016.  
  4017.  
  4018.  
  4019.  
  4020.  
  4021.  
  4022.  
  4023.  
  4024.  
  4025.  
  4026.  
  4027.  
  4028.  
  4029.  
  4030.  
  4031.  
  4032.  
  4033.  
  4034.  
  4035.  
  4036.  
  4037.  
  4038.                                 - 63 -
  4039. ................................................................................
  4040.  
  4041.  
  4042.  
  4043.       IF                         FUNCTION                          IF
  4044.  
  4045.  
  4046.       Ex.  if(num >= 0,"Positive","negative")
  4047.  
  4048.       The first parameter of the "if" function is an expression, the
  4049.       second is the value to be returned if the expression is true
  4050.       and the third is the value to be returned if the expression is
  4051.       false.
  4052.  
  4053.       If the third parameter is omitted and the expression is false
  4054.       then the field or variable retains any value it had before the
  4055.       function was called.
  4056.  
  4057.       The "if" function can be extended to a full "case" function
  4058.       simply by adding more expressions and return values.
  4059.  
  4060.       Ex.  if(num > 0,"Positive",num = 0,"Zero","Negative")
  4061.  
  4062.       There is no limit to the number of expressions and return
  4063.       values. If more than one expression is true the value returned
  4064.       is that for the first true expression. If none are true then
  4065.       the trailing value is returned as the "case else".
  4066.  
  4067.       Acceptable Parameters:
  4068.  
  4069.       Numeric expressions
  4070.       Quoted text
  4071.       Fields and variables
  4072.       Other nested functions
  4073.       System Values
  4074.  
  4075.  
  4076.  
  4077.  
  4078.  
  4079.  
  4080.  
  4081.  
  4082.  
  4083.  
  4084.  
  4085.  
  4086.  
  4087.  
  4088.  
  4089.  
  4090.  
  4091.  
  4092.  
  4093.  
  4094.  
  4095.  
  4096.  
  4097.  
  4098.  
  4099.                                 - 64 -
  4100. ................................................................................
  4101.  
  4102.  
  4103.  
  4104.       IF THEN ELSE           PROCEDURE COMMAND           IF THEN ELSE
  4105.  
  4106.  
  4107.       Easy Base recognizes the following "If Then Else"
  4108.       constructions.
  4109.  
  4110.       1.    if (condition) then (action)
  4111.             ------------------------------------------
  4112.       2.    if (condition) then (action) else (action)
  4113.             ------------------------------------------
  4114.       3.    if (condition) then
  4115.                (action)
  4116.                (action)
  4117.                (action)
  4118.             end if
  4119.             -----------------------------------------
  4120.       4.    if (condition) then
  4121.                (action)
  4122.                (action)
  4123.             else
  4124.                (action)
  4125.                (action)
  4126.             end if
  4127.  
  4128.       If then constructions can be nested to any depth.
  4129.  
  4130.       if (condition) and (condition) then
  4131.          (action)
  4132.          if (condition) or (condition) then
  4133.             (action)
  4134.             (action)
  4135.          else
  4136.             (action)
  4137.             if (condition) eqv (condition) then (action)
  4138.             (action)
  4139.          end if
  4140.          if (condition) then (action)
  4141.       else
  4142.          (action)
  4143.       end if
  4144.  
  4145.       Easy base does not interpret "Else if" constructions.
  4146.  
  4147.       Easy base does not interpret two "if" conditions on one line.
  4148.  
  4149.  
  4150.       In the above examples "action" applies to any Easy base command
  4151.       or full "Do Loop" or full "For Next" structure.
  4152.  
  4153.       You cannot split a "Do Loop" structure and you can only split a
  4154.       "For Next" structure by a simple "If then" and "End if" with no
  4155.       "else" command.
  4156.  
  4157.       Ex. on next page.
  4158.  
  4159.  
  4160.                                 - 65 -
  4161. ................................................................................
  4162.  
  4163.  
  4164.  
  4165.       IF THEN ELSE           PROCEDURE COMMAND           IF THEN ELSE
  4166.  
  4167.  
  4168.       In the following example the procedure has an input screen with
  4169.       a field "type". "type" is a choice field with the choices "In
  4170.       age order", "In alphabetic order" and "By sex". The procedure
  4171.       code selects one of three listings from the "Pupils" form by
  4172.       splitting "For Next" structures by "If Then" structures.
  4173.  
  4174.       if input.type = "in age order" then
  4175.          for pupils with age in order
  4176.       end if
  4177.       if input.type = "in alphabetic order" then
  4178.          for pupils with name in order
  4179.       end if
  4180.       if input.type = "by sex" then
  4181.          for pupils with sex in order
  4182.       end if
  4183.          print list items
  4184.       next
  4185.       next
  4186.       next
  4187.  
  4188.       The structure above is the only one in which "For Next"
  4189.       structures can be split. There must be a separate "If Then"
  4190.       followed by "End If" for each "For". There must be a "Next for
  4191.       each "For"  and there cannot be an "Else" anywhere in the
  4192.       construction.
  4193.  
  4194.  
  4195.  
  4196.  
  4197.  
  4198.  
  4199.  
  4200.  
  4201.  
  4202.  
  4203.  
  4204.  
  4205.  
  4206.  
  4207.  
  4208.  
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.  
  4217.  
  4218.  
  4219.  
  4220.  
  4221.                                 - 66 -
  4222. ................................................................................
  4223.  
  4224.  
  4225.  
  4226.       INDEX OFF              PROCEDURE COMMAND              INDEX OFF
  4227.  
  4228.  
  4229.       When an Easy Base procedure adds, updates or deletes a record
  4230.       then by default it updates any affected index files. As the
  4231.       majority of transaction procedures act on a single record this
  4232.       is the fastest method of processing. It does of course require
  4233.       that the form is periodically re-packed.  If, however, a
  4234.       procedure is to add, update or delete many records then
  4235.       updating each affected index file on each iteration of the
  4236.       "For" loop can be much slower than ignoring the indices during
  4237.       the loop and re-writing them from scratch afterward.
  4238.  
  4239.       You can take the "re-write" option by issuing the command
  4240.       "Index off" before the "For" loop.
  4241.  
  4242.       index off
  4243.       for employees
  4244.         for wagelist new record
  4245.            wagelist.worksno = employees.worksno
  4246.            wagelist.taxcode = employees.taxcode
  4247.         next
  4248.       next
  4249.  
  4250.       Obviously re-writing an entire index file when only one or two
  4251.       records are affected would be slower than simply updating the
  4252.       indices. The actual point at which "Index Off" becomes faster
  4253.       can only be determined by trial but as a general rule the two
  4254.       systems take equal time when between 12 and 15 percent of the
  4255.       records of a file are affected and the advantage of "Index Off"
  4256.       becomes greater the bigger this percentage.
  4257.  
  4258.       There is no corresponding "Index On" command. Indexing is
  4259.       turned back on automatically and the index files are re-written
  4260.       at the end of the loop to which the command applies. If you
  4261.       require indexing off during more than one loop you must issue
  4262.       the command before each.
  4263.  
  4264.       index off
  4265.       for invoices with date < makedate(05,04,93)
  4266.          delete records
  4267.       next
  4268.       index off
  4269.       for invoices with customer = "john smith"
  4270.          invoices.customer = "John Smith Ltd"
  4271.          update record
  4272.       next
  4273.  
  4274.       If you prefix a loop which deletes records from a form then the
  4275.       form is packed at the end of the loop.
  4276.  
  4277.  
  4278.  
  4279.  
  4280.  
  4281.  
  4282.                                 - 67 -
  4283. ................................................................................
  4284.  
  4285.  
  4286.  
  4287.       Input Screen Format         METHOD          Input Screen Format
  4288.  
  4289.  
  4290.       All form and input screens can be presented either mounted in a
  4291.       window against a mottled background or exactly as drawn in form
  4292.       design. The windowing effect is done automatically if you leave
  4293.       a clear border around all text and fields. If you place fields
  4294.       or text anywhere against the edge of the screen (even invisible
  4295.       fields) then the window effect will not be invoked.
  4296.  
  4297.       If you do not want the window effect but you still wish to
  4298.       leave a clear border then you should place the invisible text
  4299.       character (ASCII 255) in the top left hand corner of the
  4300.       screen to disable it. To produce the invisible character hold
  4301.       down the Alt Key and type 255 on the numeric keypad.
  4302.  
  4303.  
  4304.  
  4305.  
  4306.  
  4307.  
  4308.  
  4309.  
  4310.  
  4311.  
  4312.  
  4313.  
  4314.  
  4315.  
  4316.  
  4317.  
  4318.  
  4319.  
  4320.  
  4321.  
  4322.  
  4323.  
  4324.  
  4325.  
  4326.  
  4327.  
  4328.  
  4329.  
  4330.  
  4331.  
  4332.  
  4333.  
  4334.  
  4335.  
  4336.  
  4337.  
  4338.  
  4339.  
  4340.  
  4341.  
  4342.  
  4343.                                 - 68 -
  4344. ................................................................................
  4345.  
  4346.  
  4347.  
  4348.       INSTALL FORM               UTILITY                 INSTALL FORM
  4349.  
  4350.  
  4351.       The "Install Form" utility is accessed from the Utilities menu.
  4352.       If you wish to include a form in one application which you
  4353.       designed in another then you cannot simply copy the files to
  4354.       the new applications directory as there will be no entry in the
  4355.       "Forms Directory" file.
  4356.  
  4357.       To install a form from another application - first get the
  4358.       forms DOS filename from that application then select "Install
  4359.       Form" from the utilities menu. You will be asked to supply the
  4360.       forms name and the full path and filename from where it is to
  4361.       be copied. Easy Base will then copy the forms definition file
  4362.       and make the appropriate entry in the "Forms Directory". It
  4363.       will then ask whether or not you wish the data to be copied
  4364.       from the original application.
  4365.  
  4366.       If you install a form from another application and it has
  4367.       "lookup" derivations or Choice List fields then you will have
  4368.       to create the relationships and choice lists in the new
  4369.       application. They are not automatically reproduced.
  4370.  
  4371.  
  4372.  
  4373.  
  4374.  
  4375.  
  4376.  
  4377.  
  4378.  
  4379.  
  4380.  
  4381.  
  4382.  
  4383.  
  4384.  
  4385.  
  4386.  
  4387.  
  4388.  
  4389.  
  4390.  
  4391.  
  4392.  
  4393.  
  4394.  
  4395.  
  4396.  
  4397.  
  4398.  
  4399.  
  4400.  
  4401.  
  4402.  
  4403.  
  4404.                                 - 69 -
  4405. ................................................................................
  4406.  
  4407.  
  4408.  
  4409.       INSTALL PRINTER            UTILITY              INSTALL PRINTER
  4410.  
  4411.  
  4412.       The "Install printer" utility is accessed from the Utilities
  4413.       menu. It can also be included in a user menu so that end users
  4414.       of finished applications can install their printer without
  4415.       access to the system menus.
  4416.  
  4417.       When you select "Install Printer" you are offered a choice of
  4418.       ten printer drivers - five for named printers and five generic
  4419.       drivers. The drivers supplied cover virtually all printers
  4420.       except daisy wheels.
  4421.  
  4422.       When you have chosen your printer driver Easy Base then asks
  4423.       for the parallel port number to which printer output is to be
  4424.       sent - one or two. Easy Base does not have a built in serial
  4425.       port printer output. If your printer only has a serial input
  4426.       then you must redirect a parallel port with the DOS "Mode"
  4427.       command.
  4428.  
  4429.       Easy Base then asks how much paper wastage there is at the top
  4430.       of the page. This is quite important as it is used in
  4431.       conjunction with the paper size in use to determine the
  4432.       "Bottom Margin" value, used for pagination in printed reports.
  4433.  
  4434.       You are then asked for the wastage at the left margin. This
  4435.       information is used in the format editor to display the right
  4436.       edge of the paper at the different print sizes. There are only
  4437.       two settings for wastage at the left margin - zero and ¼ inch.
  4438.       If you have a cartridge fed printer such as a Laser or Bubble
  4439.       Jet then it will almost certainly be ¼ inch. If you have a
  4440.       traction or manual feed then you will be able to adjust the
  4441.       left margin and you should set it to zero.
  4442.  
  4443.       Finally you are asked for the top margin required in printed
  4444.       reports. This can only be between the value set as the printers
  4445.       inherent wastage and one inch.  The value you set here will be
  4446.       the default top margin for all printouts. If you need a larger
  4447.       top margin for certain printouts then you must include blank
  4448.       lines in the page header of the procedures output format.
  4449.  
  4450.  
  4451.  
  4452.  
  4453.  
  4454.  
  4455.  
  4456.  
  4457.  
  4458.  
  4459.  
  4460.  
  4461.  
  4462.  
  4463.  
  4464.  
  4465.                                 - 70 -
  4466. ................................................................................
  4467.  
  4468.  
  4469.  
  4470.       INSTALL PROCEDURE          UTILITY            INSTALL PROCEDURE
  4471.  
  4472.  
  4473.       The "Install procedure" utility is accessed from the
  4474.       Utilities menu and allows you to install procedures which you
  4475.       designed in another application. It is used exactly like the
  4476.       "Install Form" utility previously described.
  4477.  
  4478.  
  4479.  
  4480.  
  4481.  
  4482.  
  4483.  
  4484.  
  4485.  
  4486.  
  4487.  
  4488.  
  4489.  
  4490.  
  4491.  
  4492.  
  4493.  
  4494.  
  4495.  
  4496.  
  4497.  
  4498.  
  4499.  
  4500.  
  4501.  
  4502.  
  4503.  
  4504.  
  4505.  
  4506.  
  4507.  
  4508.  
  4509.  
  4510.  
  4511.  
  4512.  
  4513.  
  4514.  
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.  
  4523.  
  4524.  
  4525.  
  4526.                                 - 71 -
  4527. ................................................................................
  4528.  
  4529.  
  4530.  
  4531.       INTEGER                   FIELD TYPE                    INTEGER
  4532.  
  4533.  
  4534.       Integer fields can have up to 14 digits and use a comma as the
  4535.       thousands separator.
  4536.  
  4537.       Although integer fields display integers they store the result
  4538.       of any division correct to 15 significant figures.
  4539.  
  4540.       See - Operators Arithmetic
  4541.  
  4542.  
  4543.  
  4544.  
  4545.  
  4546.  
  4547.  
  4548.  
  4549.  
  4550.  
  4551.  
  4552.  
  4553.  
  4554.  
  4555.  
  4556.  
  4557.  
  4558.  
  4559.  
  4560.  
  4561.  
  4562.  
  4563.  
  4564.  
  4565.  
  4566.  
  4567.  
  4568.  
  4569.  
  4570.  
  4571.  
  4572.  
  4573.  
  4574.  
  4575.  
  4576.  
  4577.  
  4578.  
  4579.  
  4580.  
  4581.  
  4582.  
  4583.  
  4584.  
  4585.  
  4586.  
  4587.                                 - 72 -
  4588. ................................................................................
  4589.  
  4590.  
  4591.  
  4592.       INTEXT                     FUNCTION                      INTEXT
  4593.  
  4594.  
  4595.       This function returns the starting character number of one
  4596.       length of text within another.
  4597.  
  4598.       Ex.    Intext(companyname," and ")
  4599.              < Returns 7 if companyname = "Turner and Smith"
  4600.  
  4601.       The intext function returns 0 if the second parameter is not
  4602.       found in the first.
  4603.  
  4604.       Ex.
  4605.  
  4606.       If intext(customers.companyname," Ltd") <> 0 then
  4607.          customers.Ltd  = "yes"
  4608.          update record
  4609.       end if
  4610.  
  4611.       Acceptable parameters:
  4612.  
  4613.       Text field/variable
  4614.       Any function returning a text value
  4615.  
  4616.  
  4617.  
  4618.  
  4619.  
  4620.  
  4621.  
  4622.  
  4623.  
  4624.  
  4625.  
  4626.  
  4627.  
  4628.  
  4629.  
  4630.  
  4631.  
  4632.  
  4633.  
  4634.  
  4635.  
  4636.  
  4637.  
  4638.  
  4639.  
  4640.  
  4641.  
  4642.  
  4643.  
  4644.  
  4645.  
  4646.  
  4647.  
  4648.                                 - 73 -
  4649. ................................................................................
  4650.  
  4651.  
  4652.  
  4653.       JOINTEXT                   FUNCTION                    JOINTEXT
  4654.  
  4655.  
  4656.       Ex.  Jointext(forename,surname)
  4657.  
  4658.       The jointext function takes any number of parameters.
  4659.  
  4660.       Ex.  Jointext("Mr ",forename," ",surname," Esq.")
  4661.       Ex.  Jointext(if(sex=male,"Mr ","Ms "),surname)
  4662.  
  4663.       The "jointext" function will also perform any arithmetic
  4664.       operations required for a text output.
  4665.  
  4666.       Ex. Jointext("The Gross price is ",netprice *120/100)
  4667.  
  4668.       The "jointext" function is also used for creating compound
  4669.       index fields.
  4670.  
  4671.       Ex. Jointext(reverse(zeropad(price,4,2)),stockitem)
  4672.  
  4673.       This creates a field whose index allows a stock file to be
  4674.       listed with stockitem in alphabetical order but grouped by
  4675.       price in reverse order.
  4676.  
  4677.       If you "Jointext" a date or time field you will get the date or
  4678.       time's numeric value not the date or time's string
  4679.       representation. (See Compound Index)
  4680.  
  4681.       By default the "Jointext" function strips trailing blank space
  4682.       characters from the texts being joined. If you wish to join
  4683.       text in a Text Block field so that the second text starts on a
  4684.       new line then you can force this by including Chr$(13) which
  4685.       Easy base uses as a "New Line" flag.
  4686.  
  4687.       Ex.
  4688.  
  4689.           Jointext(block1,chr$(13),block2)
  4690.  
  4691.           <The text from block2 will start on a new line>
  4692.  
  4693.       Ex.
  4694.  
  4695.           Jointext(block1,chr$(13),chr$(13),block2)
  4696.  
  4697.          <There will be a blank line between block1 and block2>
  4698.  
  4699.       Acceptable Parameters:
  4700.  
  4701.       Numeric expressions
  4702.       Quoted text
  4703.       Fields and variables
  4704.       Other nested functions
  4705.       System Values
  4706.  
  4707.  
  4708.  
  4709.                                 - 74 -
  4710. ................................................................................
  4711.  
  4712.  
  4713.  
  4714.       LEFTTEXT                   FUNCTION                    LEFTTEXT
  4715.  
  4716.  
  4717.       This function returns a specified number of characters from the
  4718.       start of a field or variable.
  4719.  
  4720.       Ex.   Lefttext(salutation,2)
  4721.             < returns "Mr" from "Mr Smith" or "Ms" from "Ms Smith"
  4722.  
  4723.       Ex.   Lefttext(datetext(system date),4)
  4724.             < Returns 12th , 20th Etc.>   (European date format)
  4725.  
  4726.  
  4727.  
  4728.  
  4729.       Acceptable parameters:
  4730.  
  4731.       Text field/variable
  4732.       Any function returning a text value
  4733.  
  4734.  
  4735.  
  4736.  
  4737.  
  4738.  
  4739.  
  4740.  
  4741.  
  4742.  
  4743.  
  4744.  
  4745.  
  4746.  
  4747.  
  4748.  
  4749.  
  4750.  
  4751.  
  4752.  
  4753.  
  4754.  
  4755.  
  4756.  
  4757.  
  4758.  
  4759.  
  4760.  
  4761.  
  4762.  
  4763.  
  4764.  
  4765.  
  4766.  
  4767.  
  4768.  
  4769.  
  4770.                                 - 75 -
  4771. ................................................................................
  4772.  
  4773.  
  4774.  
  4775.       LENGTHTEXT                 FUNCTION                  LENGTHTEXT
  4776.  
  4777.  
  4778.       This function returns the length of text in a field or variable
  4779.  
  4780.       Ex.   lengthtext(name)
  4781.             < Returns 4 if name = "Bill"  10 if name = "Bill Smith"
  4782.  
  4783.  
  4784.       Acceptable parameters:
  4785.  
  4786.       Text field/variable
  4787.       Any function returning a text value
  4788.  
  4789.  
  4790.  
  4791.  
  4792.  
  4793.  
  4794.  
  4795.  
  4796.  
  4797.  
  4798.  
  4799.  
  4800.  
  4801.  
  4802.  
  4803.  
  4804.  
  4805.  
  4806.  
  4807.  
  4808.  
  4809.  
  4810.  
  4811.  
  4812.  
  4813.  
  4814.  
  4815.  
  4816.  
  4817.  
  4818.  
  4819.  
  4820.  
  4821.  
  4822.  
  4823.  
  4824.  
  4825.  
  4826.  
  4827.  
  4828.  
  4829.  
  4830.  
  4831.                                 - 76 -
  4832. ................................................................................
  4833.  
  4834.  
  4835.  
  4836.       LINKING APPLICATIONS        METHOD         LINKING APPLICATIONS
  4837.  
  4838.  
  4839.       Procedures in one directory can access forms in another
  4840.       directory or disk by placing the external forms path in
  4841.       brackets immediately after the form name at the start of a For
  4842.       Loop.
  4843.  
  4844.       Ex.
  4845.  
  4846.       For payroll (c:\pay) with posted = "No"
  4847.          for purchaseledger new record
  4848.             copy all from payroll
  4849.          next
  4850.          payroll.posted = "Yes"
  4851.          update record
  4852.       next
  4853.  
  4854.       The above procedure, in an accounts application, imports data
  4855.       from a payroll application in C:\PAY and updates the "Posted"
  4856.       field in the payroll application.
  4857.  
  4858.       Ex.
  4859.  
  4860.       for sales (A:\) alias import
  4861.          for sales new record
  4862.            copy all from import
  4863.          next
  4864.       next
  4865.  
  4866.       The above procedure is used to import data transferred from one
  4867.       machine to another on floppy disk.
  4868.  
  4869.       Note:-
  4870.  
  4871.       1.   If transferring data on floppy disk the floppy must hold
  4872.       the forms .DAT and .DEF files together with the BASE.DIR from
  4873.       the source application. If you need to move large amounts of
  4874.       data on floppy it is much quicker to simply overwrite an import
  4875.       forms .DAT file and then pack it to rewrite the indices.
  4876.  
  4877.  
  4878.  
  4879.  
  4880.  
  4881.  
  4882.  
  4883.  
  4884.  
  4885.  
  4886.  
  4887.  
  4888.  
  4889.  
  4890.  
  4891.  
  4892.                                 - 77 -
  4893. ................................................................................
  4894.  
  4895.  
  4896.  
  4897.       LIST FILE NAMES            UTILITY              LIST FILE NAMES
  4898.  
  4899.  
  4900.       When you give a name to a Form or Procedure in Easy Base it is
  4901.       not the actual DOS file name used. A Form has separate DOS
  4902.       files for its definition, its data and its indices. Similarly a
  4903.       procedure can have one or two files depending on whether or not
  4904.       it has an input screen. Within an application you never need to
  4905.       know the DOS filenames as Easy Base takes care of all disk
  4906.       activity in the background.
  4907.  
  4908.       You may however need to know the DOS filenames if you intend to
  4909.       export data to another program or copy a Form or Procedure from
  4910.       one application to another.
  4911.  
  4912.       You can list the DOS filenames for Forms and reports with the
  4913.       "List File Names" utility.
  4914.  
  4915.       The "List File Names" utility can also be called from a user
  4916.       menu without accessing the system.
  4917.  
  4918.  
  4919.  
  4920.  
  4921.  
  4922.  
  4923.  
  4924.  
  4925.  
  4926.  
  4927.  
  4928.  
  4929.  
  4930.  
  4931.  
  4932.  
  4933.  
  4934.  
  4935.  
  4936.  
  4937.  
  4938.  
  4939.  
  4940.  
  4941.  
  4942.  
  4943.  
  4944.  
  4945.  
  4946.  
  4947.  
  4948.  
  4949.  
  4950.  
  4951.  
  4952.  
  4953.                                 - 78 -
  4954. ................................................................................
  4955.  
  4956.  
  4957.  
  4958.       LIST VARIABLES         PROCEDURE COMMAND         LIST VARIABLES
  4959.  
  4960.  
  4961.       The "List Variables" command is a de-bugging facility for
  4962.       developers. If a procedure is not producing the expected
  4963.       results you can interrupt it at any point and view the contents
  4964.       of all fields and variables in memory at that point.
  4965.  
  4966.       Ex.
  4967.  
  4968.       for authors with surname in order
  4969.          if authors.surname = "kippling" then list variables
  4970.          for books with author = authors.surname
  4971.             print list items
  4972.          next
  4973.       next
  4974.  
  4975.  
  4976.  
  4977.  
  4978.  
  4979.  
  4980.  
  4981.  
  4982.  
  4983.  
  4984.  
  4985.  
  4986.  
  4987.  
  4988.  
  4989.  
  4990.  
  4991.  
  4992.  
  4993.  
  4994.  
  4995.  
  4996.  
  4997.  
  4998.  
  4999.  
  5000.  
  5001.  
  5002.  
  5003.  
  5004.  
  5005.  
  5006.  
  5007.  
  5008.  
  5009.  
  5010.  
  5011.  
  5012.  
  5013.  
  5014.                                 - 79 -
  5015. ................................................................................
  5016.  
  5017.  
  5018.  
  5019.       LOOKUP                     FUNCTION                      LOOKUP
  5020.  
  5021.  
  5022.       Ex. Lookup(customers,name)
  5023.  
  5024.       The first parameter is the name of a relationship defined in
  5025.       the relationships form. The second parameter is the name of the
  5026.       field in the secondary file whose value is to be looked up. The
  5027.       parameters are absolute. You cannot supply them as variables
  5028.       fields or the results of other functions.
  5029.  
  5030.       Unlike other functions, "lookup" can only be used in a field
  5031.       derivation, entry conditions and mandatory conditions. It has
  5032.       no meaning in the procedure language.
  5033.  
  5034.       A full description of how to use the Lookup function is given
  5035.       in the users manual
  5036.  
  5037.       Acceptable parameters
  5038.  
  5039.       1.   Relationship name
  5040.       2.   Field Name
  5041.  
  5042.  
  5043.  
  5044.  
  5045.  
  5046.  
  5047.  
  5048.  
  5049.  
  5050.  
  5051.  
  5052.  
  5053.  
  5054.  
  5055.  
  5056.  
  5057.  
  5058.  
  5059.  
  5060.  
  5061.  
  5062.  
  5063.  
  5064.  
  5065.  
  5066.  
  5067.  
  5068.  
  5069.  
  5070.  
  5071.  
  5072.  
  5073.  
  5074.  
  5075.                                 - 80 -
  5076. ................................................................................
  5077.  
  5078.  
  5079.  
  5080.       LOWER                      FUNCTION                       LOWER
  5081.  
  5082.  
  5083.       Returns the lower case of the parameter.
  5084.  
  5085.       Ex. lower(partname)
  5086.  
  5087.  
  5088.       Ex.
  5089.  
  5090.       Heading = Jointext("List of parts supplied by ",lower(makers.
  5091.       name))
  5092.  
  5093.  
  5094.       Acceptable parameters:
  5095.  
  5096.       Quoted text
  5097.       Text Field/variable
  5098.  
  5099.  
  5100.  
  5101.  
  5102.  
  5103.  
  5104.  
  5105.  
  5106.  
  5107.  
  5108.  
  5109.  
  5110.  
  5111.  
  5112.  
  5113.  
  5114.  
  5115.  
  5116.  
  5117.  
  5118.  
  5119.  
  5120.  
  5121.  
  5122.  
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.  
  5130.  
  5131.  
  5132.  
  5133.  
  5134.  
  5135.  
  5136.                                 - 81 -
  5137. ................................................................................
  5138.  
  5139.  
  5140.  
  5141.       MAKEDATE                   FUNCTION                    MAKEDATE
  5142.  
  5143.  
  5144.       The Easy base Date field is a six digit field which covers the
  5145.       century from 1 Jan 1981 to 31 Dec 2080 and upon which you can
  5146.       perform addition and subtraction operations in days.
  5147.  
  5148.       Ex. Duedate = Invoicedate + 30
  5149.  
  5150.       In order to provide this facility the date is held as a numeric
  5151.       value. You can only type a date directly into a date field.
  5152.  
  5153.       If you need to enter a date in a derivation or in a procedure
  5154.       code you must use the "makedate" function.
  5155.  
  5156.       Ex.  Makedate(5,11,95)
  5157.           < Returns 05/11/95 >
  5158.  
  5159.       Ex.  Nextmonth = month(system date)+1
  5160.            if nextmonth = 13 then nextmonth = 1
  5161.            Nextdelivery = makedate(1,nextmonth,year(system date))
  5162.            < Returns the date of the first of next month >
  5163.  
  5164.       Acceptable parameters
  5165.  
  5166.       Numeric value
  5167.       Numeric expression
  5168.       Numeric field/variable
  5169.       Any other function which returns a numeric value
  5170.  
  5171.  
  5172.  
  5173.  
  5174.  
  5175.  
  5176.  
  5177.  
  5178.  
  5179.  
  5180.  
  5181.  
  5182.  
  5183.  
  5184.  
  5185.  
  5186.  
  5187.  
  5188.  
  5189.  
  5190.  
  5191.  
  5192.  
  5193.  
  5194.  
  5195.  
  5196.  
  5197.                                 - 82 -
  5198. ................................................................................
  5199.  
  5200.  
  5201.  
  5202.       MAKETIME                   FUNCTION                    MAKETIME
  5203.  
  5204.  
  5205.       The value of a time field in Easy base is held as a numeric
  5206.       value representing the number of seconds past midnight. This
  5207.       allows you to perform addition and subtraction operations in
  5208.       seconds.
  5209.  
  5210.       Ex. Timetaken = Round(Endtime - Starttime / 60)
  5211.           < This returns the time taken in minutes >
  5212.  
  5213.       You can only enter a time directly into a time field.
  5214.  
  5215.       If you need to enter a time in a field derivation or in a
  5216.       procedure code you must use the "Maketime" function.
  5217.  
  5218.       Ex. Time = Maketime(20,20,00)
  5219.            <  returns 20:20:00  >
  5220.  
  5221.  
  5222.       Acceptable parameters:
  5223.  
  5224.       Numeric value
  5225.       Numeric expression
  5226.       Numeric field/variable
  5227.       Any other function which returns a numeric value
  5228.  
  5229.  
  5230.  
  5231.  
  5232.  
  5233.  
  5234.  
  5235.  
  5236.  
  5237.  
  5238.  
  5239.  
  5240.  
  5241.  
  5242.  
  5243.  
  5244.  
  5245.  
  5246.  
  5247.  
  5248.  
  5249.  
  5250.  
  5251.  
  5252.  
  5253.  
  5254.  
  5255.  
  5256.  
  5257.  
  5258.                                 - 83 -
  5259. ................................................................................
  5260.  
  5261.  
  5262.  
  5263.       MATHS                      FUNCTION                       MATHS
  5264.  
  5265.  
  5266.       The following maths functions can be used anywhere in Easy Base
  5267.       code or field derivations.
  5268.  
  5269.       Log()
  5270.       Log10()
  5271.       Sqrt()
  5272.       Sin()
  5273.       Cos()
  5274.       Tan()
  5275.       Atan()
  5276.       Deg-rad()     converts degrees to radians
  5277.       Rad-deg()     converts radians to degrees
  5278.       Exp()         Raises e (the base of natural logarithms) to the
  5279.                     power of the parameter
  5280.  
  5281.  
  5282.       Acceptable parameters:
  5283.  
  5284.       Numeric value
  5285.       Numeric expression
  5286.       Numeric field/variable
  5287.       Any function returning a numeric value
  5288.  
  5289.  
  5290.  
  5291.  
  5292.  
  5293.  
  5294.  
  5295.  
  5296.  
  5297.  
  5298.  
  5299.  
  5300.  
  5301.  
  5302.  
  5303.  
  5304.  
  5305.  
  5306.  
  5307.  
  5308.  
  5309.  
  5310.  
  5311.  
  5312.  
  5313.  
  5314.  
  5315.  
  5316.  
  5317.  
  5318.  
  5319.                                 - 84 -
  5320. ................................................................................
  5321.  
  5322.  
  5323.  
  5324.       MAXIMIZING SPEED            METHOD             MAXIMIZING SPEED
  5325.  
  5326.  
  5327.       Because the procedures you create in Easy Base have to be
  5328.       interpreted each time they are run they will tend to be slower
  5329.       than similar routines created in a compiled system. This is the
  5330.       unavoidable cost of ease of use. You can increase speed vastly
  5331.       by having the best DOS environment and by the way in which you
  5332.       write procedure code.
  5333.  
  5334.       DOS Environment.
  5335.  
  5336.       1.   Do not use a disk compression system.
  5337.  
  5338.       2.   Always load "Fastopen"  - The default settings are fine -
  5339.            just add the line "fastopen C:" to your AUTOEXEC.BAT file.
  5340.  
  5341.       3.   Use a Disk Cacheing system - The more memory you can
  5342.            allocate to it the better. Easy Software recommends
  5343.            PC-Cache from Centre Point with 2 Megabytes of expanded
  5344.            memory allocated. Smartdrive (Version supplied with
  5345.            Windows 3.1) was slightly faster but caused widespread
  5346.            disk corruptions during test "Power Failures".
  5347.       4.   Do not run any TSR programs (Especially Virus Checkers).
  5348.  
  5349.       Procedure Code.
  5350.  
  5351.       Avoid making calculations and derivations within "For" loops in
  5352.       procedures.
  5353.  
  5354.       If, for example, you had a form in which was recorded the
  5355.       length, breadth and depth of various blocks and you knew that
  5356.       at some point you would write a procedure which listed their
  5357.       volume. Add a field for volume to the form and derive it from
  5358.       the other fields. When you write the procedure you will simply
  5359.       list this field. If the field had not been added to the form
  5360.       then you would have to calculate its value on each iteration of
  5361.       the "For" loop.
  5362.  
  5363.       The time taken to derive each individual "Volume" field during
  5364.       record entry will not be noticeable but the time taken to
  5365.       derive the volume for every record during the procedure will.
  5366.  
  5367.       Keep "Running statistics".  If your program requires statistics
  5368.       derived from many hundreds or even thousands of records then
  5369.       having to wait for a procedure which calculates them each time
  5370.       you want up to date figures is a real pain.
  5371.  
  5372.       To keep "running statistics" create a form with a field for
  5373.       each statistic you require and enter a single record with zero
  5374.       values in each field. Make all entries, modifications and
  5375.       deletions to your data via procedures and you can update your
  5376.       statistics each time a record is added, modified or deleted.
  5377.  
  5378.       Example on next page.
  5379.  
  5380.                                 - 85 -
  5381. ................................................................................
  5382.  
  5383.  
  5384.  
  5385.       MAXIMIZING SPEED            METHOD             MAXIMIZING SPEED
  5386.  
  5387.  
  5388.       The following procedure code enters a record (collected via the
  5389.       input screen) to a purchases ledger and updates statistics used
  5390.       in the profit and loss account. It also updates the balance for
  5391.       the suppliers account.
  5392.  
  5393.       pause off : Escape off
  5394.       for purchases new record
  5395.          copy all from input
  5396.       next
  5397.       for stats
  5398.          if input.type = "Invoice" then
  5399.             stats.creditors = stats.creditors + input.amount
  5400.          end if
  5401.          if input.type = "CreditNote" then
  5402.             stats.creditors = stats.creditors - input.amount
  5403.          end if
  5404.          if input.type = "Payment" then
  5405.             stats.creditors = stats.creditors - input.amount
  5406.             if input.paidby = "cash" then
  5407.                stats.cashbalance = stats.cashbalance - input.amount
  5408.             else
  5409.                stats.bankbalance = stats.bankbalance - input.amount
  5410.             end if
  5411.          end if
  5412.       next
  5413.       for ACbalances with supplier = input supplier
  5414.          if input.type = "Invoice" then
  5415.             ACbalances.balance = ACbalances.balance + input.amount
  5416.          else
  5417.             ACbalances.balance = ACbalances.balance - input.amount
  5418.          end if
  5419.       next
  5420.  
  5421.       Whenever you need to know statistics for "Debtors", "Cash
  5422.       Balance" etc you can produce them instantly with a procedure
  5423.       which simply lists data from the statistics forms.
  5424.  
  5425.       Whenever you use running statistics in this way you should also
  5426.       create a procedure which does calculate them from the raw data.
  5427.       If you ever, for one reason or another, have to edit data
  5428.       directly in "Data entry" then your "running statistics" will no
  5429.       longer be accurate. You can run this procedure to correct them.
  5430.  
  5431.  
  5432.  
  5433.  
  5434.  
  5435.  
  5436.  
  5437.  
  5438.  
  5439.  
  5440.  
  5441.                                 - 86 -
  5442. ................................................................................
  5443.  
  5444.  
  5445.  
  5446.       MENU CALLS               MENU FUNCTION               MENU CALLS
  5447.  
  5448.  
  5449.       In addition to the utilities which can be called from user
  5450.       menus the following calls can also be made.
  5451.  
  5452.       Run Procedure :   Runs a pre-defined procedure
  5453.  
  5454.       Last Output   :   Recalls the output from a procedure
  5455.  
  5456.       Data Entry    :   Allows direct access to a form
  5457.  
  5458.       User Menu     :   Calls another user menu
  5459.  
  5460.       System Menus  :   Calls the Easy Base System menus
  5461.  
  5462.       Run external program :  Shells to another program - You cannot
  5463.       run another major program from within Easy Base - there is very
  5464.       little spare memory - this call is however useful for calling
  5465.       batch files which export data to other programs for later use.
  5466.  
  5467.  
  5468.  
  5469.  
  5470.  
  5471.  
  5472.  
  5473.  
  5474.  
  5475.  
  5476.  
  5477.  
  5478.  
  5479.  
  5480.  
  5481.  
  5482.  
  5483.  
  5484.  
  5485.  
  5486.  
  5487.  
  5488.  
  5489.  
  5490.  
  5491.  
  5492.  
  5493.  
  5494.  
  5495.  
  5496.  
  5497.  
  5498.  
  5499.  
  5500.  
  5501.  
  5502.                                 - 87 -
  5503. ................................................................................
  5504.  
  5505.  
  5506.  
  5507.       MIDTEXT                    FUNCTION                     MIDTEXT
  5508.  
  5509.  
  5510.       This function returns a given number of characters from a given
  5511.       starting point in a field or variable.
  5512.  
  5513.       Ex.   Midtext(fileref,4,4)
  5514.             < Returns "Bill" from "TR/Bill/1243"
  5515.  
  5516.  
  5517.       Acceptable parameters:
  5518.  
  5519.       Text field/variable
  5520.       Any function returning a text value
  5521.  
  5522.  
  5523.  
  5524.  
  5525.  
  5526.  
  5527.  
  5528.  
  5529.  
  5530.  
  5531.  
  5532.  
  5533.  
  5534.  
  5535.  
  5536.  
  5537.  
  5538.  
  5539.  
  5540.  
  5541.  
  5542.  
  5543.  
  5544.  
  5545.  
  5546.  
  5547.  
  5548.  
  5549.  
  5550.  
  5551.  
  5552.  
  5553.  
  5554.  
  5555.  
  5556.  
  5557.  
  5558.  
  5559.  
  5560.  
  5561.  
  5562.  
  5563.                                 - 88 -
  5564. ................................................................................
  5565.  
  5566.  
  5567.  
  5568.       MINUTES                    FUNCTION                     MINUTES
  5569.  
  5570.  
  5571.       This function returns the minutes number from the time field
  5572.       parameter.
  5573.  
  5574.       Ex.    minutes(system time)
  5575.  
  5576.       Ex.
  5577.  
  5578.       Unitsperhour = rounddown(60/(minutes(endtime)-
  5579.       minutes(starttime)))
  5580.  
  5581.       Acceptable parameters:
  5582.  
  5583.       System time
  5584.       Time field
  5585.       Maketime function
  5586.       Time expression
  5587.  
  5588.  
  5589.  
  5590.  
  5591.  
  5592.  
  5593.  
  5594.  
  5595.  
  5596.  
  5597.  
  5598.  
  5599.  
  5600.  
  5601.  
  5602.  
  5603.  
  5604.  
  5605.  
  5606.  
  5607.  
  5608.  
  5609.  
  5610.  
  5611.  
  5612.  
  5613.  
  5614.  
  5615.  
  5616.  
  5617.  
  5618.  
  5619.  
  5620.  
  5621.  
  5622.  
  5623.  
  5624.                                 - 89 -
  5625. ................................................................................
  5626.  
  5627.  
  5628.  
  5629.       MOD                        FUNCTION                         MOD
  5630.  
  5631.  
  5632.       The Mod function returns the remainder of an integer division
  5633.  
  5634.       Ex. surplus rounds = mod(bullets,soldiers * ammoissue)
  5635.  
  5636.  
  5637.       Ex.
  5638.  
  5639.       for Historydates
  5640.          historydates.leapyear = "No"
  5641.          if mod(historydates.year,4) = 0 then
  5642.             historydates.leapyear = "Yes"
  5643.             update record
  5644.          end if
  5645.       next
  5646.       < This example fills a new field "leapyear" which has been
  5647.       added to the "Historydates" form after data has been entered>
  5648.  
  5649.       Acceptable parameters:
  5650.  
  5651.       Numeric value
  5652.       Numeric expression
  5653.       Numeric field/variable
  5654.       Any other function which returns a numeric value
  5655.  
  5656.  
  5657.  
  5658.  
  5659.  
  5660.  
  5661.  
  5662.  
  5663.  
  5664.  
  5665.  
  5666.  
  5667.  
  5668.  
  5669.  
  5670.  
  5671.  
  5672.  
  5673.  
  5674.  
  5675.  
  5676.  
  5677.  
  5678.  
  5679.  
  5680.  
  5681.  
  5682.  
  5683.  
  5684.  
  5685.                                 - 90 -
  5686. ................................................................................
  5687.  
  5688.  
  5689.  
  5690.       MONTH                      FUNCTION                       MONTH
  5691.  
  5692.  
  5693.       This function returns the month number from a date parameter.
  5694.  
  5695.       Ex.    Month(system date)
  5696.  
  5697.       Ex.    Month(birthdate)
  5698.  
  5699.  
  5700.       Acceptable parameters
  5701.  
  5702.       System date
  5703.       Date field
  5704.       Makedate function
  5705.       Date expression
  5706.  
  5707.  
  5708.  
  5709.  
  5710.  
  5711.  
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718.  
  5719.  
  5720.  
  5721.  
  5722.  
  5723.  
  5724.  
  5725.  
  5726.  
  5727.  
  5728.  
  5729.  
  5730.  
  5731.  
  5732.  
  5733.  
  5734.  
  5735.  
  5736.  
  5737.  
  5738.  
  5739.  
  5740.  
  5741.  
  5742.  
  5743.  
  5744.  
  5745.  
  5746.                                 - 91 -
  5747. ................................................................................
  5748.  
  5749.  
  5750.  
  5751.       MULTIPLE COLUMNS            METHOD             MULTIPLE COLUMNS
  5752.  
  5753.  
  5754.       You may occasionally need to list data in order but in more
  5755.       than one column. Indexes for technical manuals are a common
  5756.       example. It would be nice if you could send the printer head
  5757.       back to the top of the page for each column but you can't. You
  5758.       must therefore get all the data for each horizontal line into
  5759.       memory at the same time and then print it.
  5760.  
  5761.       The following example prints the "Title" field from a "Films"
  5762.       form in alphabetic order in two columns with fifty lines on
  5763.       each page. To do this a field "No" is added to the form. This
  5764.       is an integer field and it is indexed.
  5765.  
  5766.       declare output fields
  5767.          films.title : righttitle
  5768.       end
  5769.       declare variables
  5770.          x as number  : y as number : lasttitle as text
  5771.       end
  5772.       '................UPDATE THE No FIELD......
  5773.       for films with title in order
  5774.          y = total records
  5775.          x = x + 1
  5776.          display status "Updating No field record" + x + "of" + y
  5777.          films.No = x
  5778.          update record
  5779.       next
  5780.       '.................PRINT IN TWO COLUMNS.................
  5781.       x = 0                        'reuse x as counter
  5782.       do
  5783.          for films with title > lasttitle
  5784.             x = x + 1
  5785.             for films alias col2 with No = films.No + 50
  5786.               righttitle = col2.title
  5787.             next
  5788.             print list items
  5789.             lasttitle = righttitle : righttitle = blank
  5790.             if mod(x,50) = 0 then
  5791.                page feed : Exit for
  5792.             end if
  5793.          next
  5794.          if lasttitle = blank then exit do
  5795.       loop
  5796.  
  5797.       ........................Format..................
  5798.  
  5799.       .list items
  5800.             { Films.title field  }      {  Righttitle Field  }
  5801.       .end
  5802.  
  5803.  
  5804.  
  5805.  
  5806.  
  5807.                                 - 92 -
  5808. ................................................................................
  5809.  
  5810.  
  5811.  
  5812.       MULTIPLE LINES         PROCEDURE COMMAND         MULTIPLE LINES
  5813.  
  5814.  
  5815.       You can place multiple code instructions on a single line of
  5816.       the code editor by separating them with a colon.
  5817.  
  5818.       Ex.
  5819.  
  5820.       for ledger with lineno = input.lineno
  5821.          ledger.net = input.net:ledger.vat = input.vat
  5822.          ledger.acno = input.acno:ledger.gross = input.gross
  5823.          update record
  5824.       next
  5825.  
  5826.  
  5827.  
  5828.  
  5829.  
  5830.  
  5831.  
  5832.  
  5833.  
  5834.  
  5835.  
  5836.  
  5837.  
  5838.  
  5839.  
  5840.  
  5841.  
  5842.  
  5843.  
  5844.  
  5845.  
  5846.  
  5847.  
  5848.  
  5849.  
  5850.  
  5851.  
  5852.  
  5853.  
  5854.  
  5855.  
  5856.  
  5857.  
  5858.  
  5859.  
  5860.  
  5861.  
  5862.  
  5863.  
  5864.  
  5865.  
  5866.  
  5867.  
  5868.                                 - 93 -
  5869. ................................................................................
  5870.  
  5871.  
  5872.  
  5873.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  5874.  
  5875.  
  5876.       If you want to print procedure output on both sides of the
  5877.       paper then, unless you have a VERY expensive printer, the only
  5878.       way to achieve this is to print the odd pages, turn your paper
  5879.       over and print the even pages.  For a short report you can do
  5880.       this by setting paper feed to "Manual" from the utilities menu
  5881.       and turning each sheet over individually. If, however, you have
  5882.       a cut sheet feeder or a cartridge fed printer it is much
  5883.       quicker to print all the odd pages, turn them all over and then
  5884.       print all the even pages.
  5885.  
  5886.       To do this in Easy Base, issue the command "Odd Page Print"
  5887.       immediately before the print output and "Even Page Print"
  5888.       immediately after it.
  5889.  
  5890.       declare output fields
  5891.          customers.name : customers.phone
  5892.       end
  5893.       odd page print
  5894.       for customers with surname in order
  5895.          if bottom margin < .75 then page feed
  5896.          print list items
  5897.       next
  5898.       even page print    '(Easy Base pauses here till you are ready)
  5899.  
  5900.       If you will be binding your printed report down the left hand
  5901.       edge then you will need a larger left margin on the odd pages
  5902.       than on the even. If you start odd page printing with the
  5903.       command "Odd Page Print for Binding" then Easy Base will add
  5904.       half an inch to the format left margin when it prints the odd
  5905.       pages. You cannot alter the fixed value of half an inch but if
  5906.       you create your output format with a left margin of half an
  5907.       inch(suitable for the even pages) and print for binding, you
  5908.       will find that the resulting output suits most office binding
  5909.       systems.
  5910.  
  5911.       If you use Odd/Even page printing then it is important that you
  5912.       realize it is achieved by running the portion of your procedure
  5913.       between the "Odd Page Print" and "Even Page Print" twice -
  5914.       simply cancelling output to the printer at the appropriate
  5915.       times.  You must not, therefore include any commands which add,
  5916.       update or delete records between the commands. If you do they
  5917.       will be performed twice. Similarly if you are running a loop
  5918.       counter during the print process then it will have double the
  5919.       expected value after the "Even Page Print" command.
  5920.  
  5921.       The system value "Page Number" is reset to one at the "Even
  5922.       Page Print" command. If you include two separate sets of odd
  5923.       and even printing in a single procedure then you cannot use
  5924.       "Page Number" to number the second printout. You can of course
  5925.       use an ad hoc field. Just remember to reset it to one
  5926.       immediately before the "Even Page Print" command.
  5927.  
  5928.  
  5929.                                 - 94 -
  5930. ................................................................................
  5931.  
  5932.  
  5933.  
  5934.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  5935.  
  5936.  
  5937.       This document was written in an Easy Base form "Ref" which has
  5938.       fields "Name", "Type", "Pageno" "Topicpage" and three text
  5939.       block fields "T1", "T2" and "T3". Each record holds one page of
  5940.       the reference manual and the pages were entered in no
  5941.       particular order. The following procedure was used to number,
  5942.       sort, index and print the manual.
  5943.  
  5944.       declare output fields
  5945.          ref.name : ref.type :ref.pageno
  5946.          ref.t1 : ref.t2 : ref.t3 : type : name
  5947.       end
  5948.       declare variables
  5949.          x as number : y as number
  5950.          namelen as number : typelen as number
  5951.       end
  5952.       '.....................NUMBER REFERENCE PAGES....
  5953.       for ref with name in order
  5954.          y = total records
  5955.          x = x + 1
  5956.          display status "Numbering page" + x + "of" + y
  5957.          ref.pageno = x : update record
  5958.       next
  5959.       odd page print for binding
  5960.       '...............PRINT COMMANDS INDEX........
  5961.       bold on : print commandheader : bold off
  5962.       for ref with type = "procedure command"
  5963.          subindex name
  5964.       next
  5965.       for ref with subindex in order
  5966.          if topicpage > 1 then skiprec  'only first page
  5967.          ref.name = proper(ref.name)    'of each topic listed
  5968.          print commands
  5969.       next
  5970.       '..............PRINT SYSTEM VALUES INDEX...
  5971.       bold on : print valuesheader : bold off
  5972.       for ref with type = "system value"
  5973.          subindex name
  5974.       next
  5975.       for ref with subindex in order
  5976.          if topicpage > 1  then skiprec
  5977.          ref.name = proper(ref.name)
  5978.          print values
  5979.       next
  5980.       page feed       '... eject first index page
  5981.  
  5982.       '......... subsequent index pages are produced with exactly
  5983.       '........ the sane code as above and are omitted for clarity.
  5984.  
  5985.       '......................MAIN REFERENCE.............
  5986.       page feed
  5987.       for ref with name in order
  5988.          namelen = lengthtext(ref.name)
  5989.  
  5990.                                 - 95 -
  5991. ................................................................................
  5992.  
  5993.  
  5994.  
  5995.       ODD/EVEN PAGE PRINT    PROCEDURE COMMAND    ODD/EVEN PAGE PRINT
  5996.  
  5997.  
  5998.          typelen = lengthtext(ref.type)
  5999.          '....centre justify type
  6000.          type = jointext(stringof((20-typelen)/2,chr$(255)),ref.type)
  6001.          '....right justify name
  6002.          name = jointext(stringof(20-namelen,chr$(255)),ref.name)
  6003.          bold on : print refheader : bold off  'type and names fields
  6004.          print list items                      't1, t2, t3
  6005.          bold on print reffoot                 'pageno
  6006.          page feed
  6007.       next
  6008.       even page print
  6009.  
  6010.  
  6011.  
  6012.  
  6013.  
  6014.  
  6015.  
  6016.  
  6017.  
  6018.  
  6019.  
  6020.  
  6021.  
  6022.  
  6023.  
  6024.  
  6025.  
  6026.  
  6027.  
  6028.  
  6029.  
  6030.  
  6031.  
  6032.  
  6033.  
  6034.  
  6035.  
  6036.  
  6037.  
  6038.  
  6039.  
  6040.  
  6041.  
  6042.  
  6043.  
  6044.  
  6045.  
  6046.  
  6047.  
  6048.  
  6049.  
  6050.  
  6051.                                 - 96 -
  6052. ................................................................................
  6053.  
  6054.  
  6055.  
  6056.       OPERATORS                 ARITHMETIC                  OPERATORS
  6057.  
  6058.  
  6059.       The arithmetic operators used in Easy Base are:-
  6060.  
  6061.       +   (addition)
  6062.  
  6063.       -   (subtraction and negation)
  6064.  
  6065.       *   (multiplication)
  6066.  
  6067.       /   (division)
  6068.  
  6069.       ^   (exponentiation)
  6070.  
  6071.       Where there are multiple operators in a derivation they are
  6072.       processed with the following precedence:-
  6073.  
  6074.       1.   Exponentiation
  6075.       2.   Negation
  6076.       3.   Multiplication and Division
  6077.       4.   Addition and Subtraction
  6078.  
  6079.       The default precedence can be altered by the use of
  6080.       parenthesis.
  6081.  
  6082.            Easy base does not perform Integer Arithmetic.
  6083.  
  6084.       When a numeric field shows the result of a division the
  6085.       "displayed" number is "truncated" to an integer in Integer
  6086.       fields and has the last digit rounded in Fixed Point and
  6087.       Floating Point fields.  The "Stored" value which is used in any
  6088.       further calculations, however, is always correct to 15
  6089.       significant figures irrelevant of field type.  For Example: If
  6090.       three fields x,y and z are defined as integers, y is derived as
  6091.       x/4 and z is derived as y*4 then when 9 is entered in x, y will
  6092.       derive as 2 but z will derive as 9 because it multiplies the
  6093.       "stored value" of 2.25 by 4 not the displayed value of 2.
  6094.  
  6095.       Handling arithmetic in this way means that, by default there
  6096.       are no rounding errors. This has several advantages not least
  6097.       that currency values need only ever be defined to two decimal
  6098.       places.
  6099.  
  6100.       It does mean, however, that should you require rounding errors
  6101.       to be carried forward you must use one of the Easy Base
  6102.       rounding functions on the result of any intermediate division.
  6103.  
  6104.       In the above example, had y been derived as "round(x/4)" then z
  6105.       would derive as 8.
  6106.  
  6107.       If a fourth field had the formula:- if(y = 2,5,10) it would
  6108.       only derive as 5 if y had been rounded or if 8 had been entered
  6109.       in x.
  6110.  
  6111.  
  6112.                                 - 97 -
  6113. ................................................................................
  6114.  
  6115.  
  6116.  
  6117.       OPERATORS                 RELATIONAL                  OPERATORS
  6118.  
  6119.  
  6120.       Easy base uses the following relational operators:-
  6121.  
  6122.       =    (equals)
  6123.       <>   (not equals)
  6124.       >    (greater than)
  6125.       <    (less than)
  6126.       >=   (greater than or equal to)
  6127.       <=   (less than or equal to)
  6128.  
  6129.  
  6130.       Where relational operators and arithmetic operators are both
  6131.       used in a derivation. Relational operations are performed after
  6132.       arithmetic operations.
  6133.  
  6134.       Text values are not case sensitive when compared with
  6135.       relational operators.
  6136.  
  6137.       When you compare two fields or variables, the comparison is
  6138.       numeric if both are numeric and alphabetic if both are
  6139.       alphabetic.  If you compare a numeric field with a text field
  6140.       then Easy Base will test to see if the text field contains a
  6141.       number.  If it does then the comparison will be numeric and if
  6142.       it does not then the comparison will be alphabetic.
  6143.  
  6144.       WARNING
  6145.  
  6146.       If you compare the result of a division in an integer or fixed
  6147.       point field using the = or the <> operators, then the value
  6148.       used for comparison will be the (accurate) stored value and not
  6149.       the "Truncated" number shown in the field.
  6150.  
  6151.       See Operators Arithmetic
  6152.  
  6153.  
  6154.  
  6155.  
  6156.  
  6157.  
  6158.  
  6159.  
  6160.  
  6161.  
  6162.  
  6163.  
  6164.  
  6165.  
  6166.  
  6167.  
  6168.  
  6169.  
  6170.  
  6171.  
  6172.  
  6173.                                 - 98 -
  6174. ................................................................................
  6175.  
  6176.  
  6177.  
  6178.       OPERATORS                  LOGICAL                    OPERATORS
  6179.  
  6180.  
  6181.       Easy Base uses the following logical operators:-
  6182.  
  6183.       1.  and
  6184.       2.  or
  6185.       3.  xor     (or exclusive)
  6186.       4.  eqv     (equivalence)
  6187.       5.  imp     (implication)
  6188.  
  6189.       Logical operations are performed last after arithmetic and
  6190.       relational.
  6191.  
  6192.       Logical operators return a boolean (true or false) value from
  6193.       two other boolean expressions.
  6194.  
  6195.       Ex.
  6196.  
  6197.       If(x = y and a = b,"Yes","No")
  6198.          < Yes is returned if both expressions are true >
  6199.  
  6200.       If(x = y or a = b,"Yes","No")
  6201.          < Yes is returned if either or both expressions are true >
  6202.  
  6203.       If(x = y xor a = b,"Yes","No")
  6204.          < Yes is returned if either one but not both are true >
  6205.  
  6206.       If(x = y eqv a = b,"Yes","No")
  6207.          < Yes is returned if both expressions are true or if both
  6208.            expressions are false >
  6209.  
  6210.       If(x = y imp a = b,"Yes","No")
  6211.  
  6212.          < Yes is returned for all combinations except the first
  6213.            expression being true and the second false >
  6214.  
  6215.       The Easy Base logical operators are primarily designed for use
  6216.       within the "If" function and in "If..Then..Else" constructions
  6217.       where their actual value is not relevant. If you wish to use
  6218.       the value of "false" in formulae then it is represented by 0.
  6219.       True can be represented by any value other than 0 and should
  6220.       not be used.
  6221.  
  6222.  
  6223.  
  6224.  
  6225.  
  6226.  
  6227.  
  6228.  
  6229.  
  6230.  
  6231.  
  6232.  
  6233.  
  6234.                                 - 99 -
  6235. ................................................................................
  6236.  
  6237.  
  6238.  
  6239.       OPTIONS                    UTILITY                      OPTIONS
  6240.  
  6241.  
  6242.       The "Options" utility allows you to select your preferred date
  6243.       format (European or North American).
  6244.  
  6245.       You can also enable or disable screen saving. If enabled the
  6246.       screen saver operates after three minutes without a keypress
  6247.       during record entry, procedure screen entry or if a menu is
  6248.       being displayed. The screensaver is never invoked while a
  6249.       procedure is running or while reformatting or re-indexing is
  6250.       taking place.
  6251.  
  6252.       The third option allows you to select the border style you
  6253.       require around menus and message boxes.
  6254.  
  6255.       Option four selects whether or not screen clearing will be done
  6256.       with the curtain effect.
  6257.  
  6258.       Option five selects the COM port which will be used during
  6259.       Auto-dialling.
  6260.  
  6261.       The options utility can be called as a user menu function so
  6262.       that an end user can access the facilities without access to
  6263.       the system menus.
  6264.  
  6265.  
  6266.  
  6267.  
  6268.  
  6269.  
  6270.  
  6271.  
  6272.  
  6273.  
  6274.  
  6275.  
  6276.  
  6277.  
  6278.  
  6279.  
  6280.  
  6281.  
  6282.  
  6283.  
  6284.  
  6285.  
  6286.  
  6287.  
  6288.  
  6289.  
  6290.  
  6291.  
  6292.  
  6293.  
  6294.  
  6295.                                 - 100 -
  6296. ................................................................................
  6297.  
  6298.  
  6299.  
  6300.       OUTPUT                   SYSTEM VALUE                    OUTPUT
  6301.  
  6302.  
  6303.       When a user runs a procedure his choice of output, screen,
  6304.       printer or disk is stored in the system value "Output".
  6305.  
  6306.       By accessing the system value "Output" you can make your
  6307.       procedure do different things depending on where the output is
  6308.       to be sent.
  6309.  
  6310.       Ex.
  6311.  
  6312.       if output = "screen" then
  6313.          print heading1
  6314.       else
  6315.          print heading2
  6316.       end if
  6317.  
  6318.  
  6319.  
  6320.  
  6321.  
  6322.  
  6323.  
  6324.  
  6325.  
  6326.  
  6327.  
  6328.  
  6329.  
  6330.  
  6331.  
  6332.  
  6333.  
  6334.  
  6335.  
  6336.  
  6337.  
  6338.  
  6339.  
  6340.  
  6341.  
  6342.  
  6343.  
  6344.  
  6345.  
  6346.  
  6347.  
  6348.  
  6349.  
  6350.  
  6351.  
  6352.  
  6353.  
  6354.  
  6355.  
  6356.                                 - 101 -
  6357. ................................................................................
  6358.  
  6359.  
  6360.  
  6361.       PACK DATA FORMS            UTILITY              PACK DATA FORMS
  6362.  
  6363.  
  6364.       The process of actually removing a deleted record from a form
  6365.       is time consuming. What actually happens is that all the "Live"
  6366.       records are copied to a temporary file. The original file is
  6367.       then deleted and the temporary one re-named to the original
  6368.       name. Because of this it is actually quicker to remove fifty
  6369.       "Dead" records than it is to remove one. To save you time Easy
  6370.       base follows the traditional data-base custom of simply marking
  6371.       records for deletion when you delete them. They are only
  6372.       physically removed from the form during a "Pack" operation.
  6373.       When you "Pack" a data file Easy Base also re-writes all the
  6374.       index files for that form. You can pack individual forms with
  6375.       the "Pack Data Forms" utility accessed from the Utilities menu.
  6376.       You can also call the "Pack Data Forms" utility as a User menu
  6377.       function. In a finished application any necessary packing would
  6378.       normally be done from a batch execute menu which would run
  6379.       while the computer was unattended.
  6380.  
  6381.       Forms in which records are regularly deleted should be packed
  6382.       regularly. If packing is not done then not only will you be
  6383.       wasting disk space but search operations will become
  6384.       progressively slower as the percentage of "Dead" records
  6385.       increases.
  6386.  
  6387.       This is fairly obvious - however it is not so obvious that a
  6388.       forms index files can accumulate "Dead" records even though
  6389.       none have been deleted from the main file. An index file is
  6390.       simply the indexed fields contents and record number arranged
  6391.       in order. If, having filed a record you then alter the contents
  6392.       of an indexed field and update the record then the original
  6393.       record in the index file is deleted and a new one entered.
  6394.  
  6395.       Index files with "Dead records" also waste disk space and slow
  6396.       search operations. You should therefore regularly pack any
  6397.       forms which are regularly updated.
  6398.  
  6399.       If you are unsure which forms need to be packed you can use the
  6400.       "Auto-Pack" utility which tests each form and each forms index
  6401.       files for "Dead" records. The form is packed if it or any of
  6402.       its index files is found to have more then 100 total or 10 per
  6403.       cent "Dead" records.
  6404.  
  6405.       Although "Auto-Pack" may seem the easy answer, an application
  6406.       will almost certainly have several forms with "Core" data which
  6407.       remain unchanged and therefore never require packing. If you
  6408.       can identify the forms which do need to be packed and do them
  6409.       individually or from a batch execute menu this will be less
  6410.       time consuming than always using the "Auto-Pack" facility.
  6411.  
  6412.  
  6413.  
  6414.  
  6415.  
  6416.  
  6417.                                 - 102 -
  6418. ................................................................................
  6419.  
  6420.  
  6421.  
  6422.       PAGE NUMBER              SYSTEM VALUE               PAGE NUMBER
  6423.  
  6424.  
  6425.       Whenever Easy Base is processing a procedure with an output it
  6426.       keeps track of the current page number (Even if you have not
  6427.       included Page Feed commands). You can use the system value
  6428.       "Page Number" to number the pages of your output. To use the
  6429.       "Page Number" value just include "Page Number" in your output
  6430.       field declarations.
  6431.  
  6432.       Declare output fields
  6433.          Customers.name : Customers.ACNO : Page Number
  6434.       end
  6435.  
  6436.       You can then use the "Page Number" field in the Page Header or
  6437.       Page Footer section of your output format.
  6438.  
  6439.  
  6440.  
  6441.  
  6442.  
  6443.  
  6444.  
  6445.  
  6446.  
  6447.  
  6448.  
  6449.  
  6450.  
  6451.  
  6452.  
  6453.  
  6454.  
  6455.  
  6456.  
  6457.  
  6458.  
  6459.  
  6460.  
  6461.  
  6462.  
  6463.  
  6464.  
  6465.  
  6466.  
  6467.  
  6468.  
  6469.  
  6470.  
  6471.  
  6472.  
  6473.  
  6474.  
  6475.  
  6476.  
  6477.  
  6478.                                 - 103 -
  6479. ................................................................................
  6480.  
  6481.  
  6482.  
  6483.       PAUSE ON/OFF           PROCEDURE COMMAND           PAUSE ON/OFF
  6484.  
  6485.  
  6486.       When an Easy Base procedure has an output to the screen, the
  6487.       output, by default scrolls continuously until the procedure is
  6488.       complete. You can allow the user to pause the output with the
  6489.       "Pause On" command.
  6490.  
  6491.       If a procedure performs several tasks then the pause facility
  6492.       can be selectively enabled and disabled at any point.
  6493.  
  6494.       Ex.
  6495.  
  6496.       for employees alias types with type in order unique
  6497.          pause off:escape off
  6498.          for employees alias group with type = types.type
  6499.             subindex surname
  6500.          next
  6501.          pause on
  6502.          for employees with subindex in order
  6503.             print list items
  6504.          next
  6505.       next
  6506.  
  6507.       The above code fragment prints employees details in type groups
  6508.       with surname in alphabetic order. During the procedure the user
  6509.       can pause the report while it is listing the output but not
  6510.       while it is subindexing the group.
  6511.  
  6512.  
  6513.  
  6514.  
  6515.  
  6516.  
  6517.  
  6518.  
  6519.  
  6520.  
  6521.  
  6522.  
  6523.  
  6524.  
  6525.  
  6526.  
  6527.  
  6528.  
  6529.  
  6530.  
  6531.  
  6532.  
  6533.  
  6534.  
  6535.  
  6536.  
  6537.  
  6538.  
  6539.                                 - 104 -
  6540. ................................................................................
  6541.  
  6542.  
  6543.  
  6544.       PI                       SYSTEM VALUE                        PI
  6545.  
  6546.  
  6547.       You can use the value of π anywhere in field derivations or
  6548.       procedure code by quoting "Pi".
  6549.  
  6550.       Ex     circlearea = Pi / 4 diam^2
  6551.  
  6552.  
  6553.  
  6554.  
  6555.  
  6556.  
  6557.  
  6558.  
  6559.  
  6560.  
  6561.  
  6562.  
  6563.  
  6564.  
  6565.  
  6566.  
  6567.  
  6568.  
  6569.  
  6570.  
  6571.  
  6572.  
  6573.  
  6574.  
  6575.  
  6576.  
  6577.  
  6578.  
  6579.  
  6580.  
  6581.  
  6582.  
  6583.  
  6584.  
  6585.  
  6586.  
  6587.  
  6588.  
  6589.  
  6590.  
  6591.  
  6592.  
  6593.  
  6594.  
  6595.  
  6596.  
  6597.  
  6598.  
  6599.  
  6600.                                 - 105 -
  6601. ................................................................................
  6602.  
  6603.  
  6604.  
  6605.       PRESELECT              PROCEDURE COMMAND              PRESELECT
  6606.  
  6607.  
  6608.       The "Preselect" command sets highlighting of the next user menu
  6609.       when the procedure terminates.  If a procedure is normally
  6610.       followed by a particular selection from the menu then you can
  6611.       save the user the trouble of choosing it by issuing the
  6612.       "Preselect" command within the procedure.
  6613.  
  6614.       for currentcustomer
  6615.          currentcustomer.acno = input.acno
  6616.          update record
  6617.       next
  6618.       preselect 4
  6619.  
  6620.  
  6621.  
  6622.  
  6623.  
  6624.  
  6625.  
  6626.  
  6627.  
  6628.  
  6629.  
  6630.  
  6631.  
  6632.  
  6633.  
  6634.  
  6635.  
  6636.  
  6637.  
  6638.  
  6639.  
  6640.  
  6641.  
  6642.  
  6643.  
  6644.  
  6645.  
  6646.  
  6647.  
  6648.  
  6649.  
  6650.  
  6651.  
  6652.  
  6653.  
  6654.  
  6655.  
  6656.  
  6657.  
  6658.  
  6659.  
  6660.  
  6661.                                 - 106 -
  6662. ................................................................................
  6663.  
  6664.  
  6665.  
  6666.       PRINT                  PROCEDURE COMMAND                  PRINT
  6667.  
  6668.  
  6669.       In Easy Base procedures, all output to the screen or printer is
  6670.       initiated with the "Print" command. The "Print" command prints
  6671.       sections from the procedures output format.
  6672.  
  6673.       Ex.
  6674.  
  6675.       '......................procedure code....
  6676.       Print report header
  6677.       for customers
  6678.          print list items
  6679.       next
  6680.       print report footer
  6681.       '......................Output Format.......
  6682.       .Report Header
  6683.             ════════════════════════════════════════════════
  6684.                           Customer List
  6685.             ════════════════════════════════════════════════
  6686.       .List Items
  6687.             {customers.name field}  {customers.phone field}
  6688.       .Report Footer
  6689.             ════════════════════════════════════════════════
  6690.       .end
  6691.  
  6692.       The format sections are marked with a full stop in the margin
  6693.       followed by the section name. When you type a full stop in the
  6694.       margin of the "Format editor" Easy Base will offer you a
  6695.       selection of section names. You do not have to use these - they
  6696.       are just some common names that can save you time. To enter
  6697.       your own section names just press escape and type in any name
  6698.       you wish.
  6699.  
  6700.       The ".end" section is not strictly necessary but it is easy to
  6701.       accidentally insert blank lines at the end of your format. By
  6702.       inserting ".end" at the end of the last section you will
  6703.       prevent these from being printed.
  6704.  
  6705.  
  6706.  
  6707.  
  6708.  
  6709.  
  6710.  
  6711.  
  6712.  
  6713.  
  6714.  
  6715.  
  6716.  
  6717.  
  6718.  
  6719.  
  6720.  
  6721.  
  6722.                                 - 107 -
  6723. ................................................................................
  6724.  
  6725.  
  6726.  
  6727.       PRINTER CONTROL        PROCEDURE COMMAND        PRINTER CONTROL
  6728.  
  6729.  
  6730.       When you send a procedure output to the printer Easy Base will
  6731.       initialize your printer at ten characters per inch, six lines
  6732.       per inch in draft mode.
  6733.  
  6734.       You can alter the printer mode anywhere within a procedure with
  6735.       the following printer controls.
  6736.  
  6737.       Bold On            Bold Off
  6738.       Underline On       Underline Off
  6739.       Italic On          Italic Off
  6740.       NLQ On             NLQ Off
  6741.  
  6742.       8 lpi      Sets printing to eight lines per inch
  6743.       6 lpi      Sets printing to six lines per inch
  6744.       10 cpi     Sets printing to ten characters per inch
  6745.       12 cpi     Sets printing to twelve characters per inch
  6746.       17 cpi     sets printing to either 15 or 17 depending on
  6747.                  printer
  6748.       Line Feed  Advances the print head one line
  6749.       Page Feed  Ejects the current page.
  6750.  
  6751.       Ex.
  6752.       NLQ On
  6753.       Bold on
  6754.       Print report header
  6755.       Bold Off
  6756.       12 CPI
  6757.       For customers
  6758.          print list items
  6759.          if bottom margin < 1.5 then
  6760.             Line feed : Bold On : 10 CPI
  6761.             Print Page footer
  6762.             Page feed
  6763.             Print Page header
  6764.             Bold Off : 12 CPI
  6765.          end if
  6766.       next
  6767.       Bold on:Italic On :10 CPI
  6768.       print report footer
  6769.  
  6770.       The above example turns Near Letter Quality printing on for the
  6771.       entire report. It prints page headers and footers in bold at 10
  6772.       characters per inch, list items at 12 characters per inch and
  6773.       the report footer in bold italics.
  6774.  
  6775.  
  6776.  
  6777.  
  6778.  
  6779.  
  6780.  
  6781.  
  6782.  
  6783.                                 - 108 -
  6784. ................................................................................
  6785.  
  6786.  
  6787.  
  6788.       PROPER                     FUNCTION                      PROPER
  6789.  
  6790.  
  6791.       This function returns the parameter with the first letter of
  6792.       each word in upper case and the rest in lower case. If you wish
  6793.       to enter initials in a field derived as proper and keep them in
  6794.       upper case then there must either be a space or a full stop
  6795.       between them.
  6796.  
  6797.       Ex.     Proper(Address)
  6798.  
  6799.       Ex.
  6800.  
  6801.       labelname = upper(company.name)
  6802.       insetname = proper(company.name)
  6803.  
  6804.  
  6805.       Acceptable parameters:
  6806.  
  6807.       Quoted text
  6808.       Text field/variable
  6809.  
  6810.  
  6811.  
  6812.  
  6813.  
  6814.  
  6815.  
  6816.  
  6817.  
  6818.  
  6819.  
  6820.  
  6821.  
  6822.  
  6823.  
  6824.  
  6825.  
  6826.  
  6827.  
  6828.  
  6829.  
  6830.  
  6831.  
  6832.  
  6833.  
  6834.  
  6835.  
  6836.  
  6837.  
  6838.  
  6839.  
  6840.  
  6841.  
  6842.  
  6843.  
  6844.                                 - 109 -
  6845. ................................................................................
  6846.  
  6847.  
  6848.  
  6849.       Q AND A INPUT SCREEN        METHOD         Q AND A INPUT SCREEN
  6850.  
  6851.  
  6852.       If, for a procedure you have to collect many items of data via
  6853.       an input screen, then presenting all the fields and their
  6854.       labels at once can be confusing to an operator.  You can start
  6855.       with an empty screen other than the first field and its prompt
  6856.       then have each subsequent prompt "Pop up" when the previous
  6857.       field has been filled.
  6858.  
  6859.       To do this you make all your input fields without a background
  6860.       (Text, Alt1 or Alt2) and you create fields for the prompts
  6861.       which have no user entry and also show no background.
  6862.  
  6863.       Ex.
  6864.  
  6865.       To collect data for paymethod, customer, and amount lay out the
  6866.       following fields:-
  6867.  
  6868.               Enter Method of payment....     { Paymethod Field }
  6869.               { Pop1 Field               }    { Customer Field  }
  6870.               { Pop2 Field               }    { Amount Field   }
  6871.  
  6872.       The "Pop1" field is derived:-
  6873.  
  6874.          If(Pop1 = blank and paymethod = blank,blank,"Enter Customers
  6875.                  name.........")
  6876.  
  6877.       and the "Pop2" field is derived:-
  6878.  
  6879.          If(Pop2 = blank and customer = blank,blank,"Enter Amount...
  6880.                 ...............")
  6881.  
  6882.  
  6883.  
  6884.  
  6885.  
  6886.  
  6887.  
  6888.  
  6889.  
  6890.  
  6891.  
  6892.  
  6893.  
  6894.  
  6895.  
  6896.  
  6897.  
  6898.  
  6899.  
  6900.  
  6901.  
  6902.  
  6903.  
  6904.  
  6905.                                 - 110 -
  6906. ................................................................................
  6907.  
  6908.  
  6909.  
  6910.       RANDOM                     FUNCTION                      RANDOM
  6911.  
  6912.  
  6913.       This function returns a random number between the upper and
  6914.       lower parameters.
  6915.  
  6916.       Ex.  Random(1,100)
  6917.          <Returns a random number between 1 and 100>
  6918.  
  6919.       Ex.  The two fields No and card simulate the random cutting of
  6920.       a deck of cards each time the No field is cleared.
  6921.  
  6922.       No field derivation:-
  6923.           if(no <> blank,no,random(1,52))
  6924.  
  6925.       Card field derivation:-
  6926.  
  6927.           jointext(if(mod(no,13) = 1,"Ace",mod(no,13) = 0,"King",
  6928.       mod(no,13) = 12,"Queen",mod(no,13) = 11,"Jack",mod(no,13)),
  6929.       " of ",if(no < 14,"Hearts",no < 27 ,"Clubs",no <40,"Diamonds",
  6930.       ,"Spades"))
  6931.  
  6932.  
  6933.       Acceptable parameters
  6934.  
  6935.       Numeric Value
  6936.       Numeric expression
  6937.       Numeric field/variable
  6938.       Any other function which returns a numeric value
  6939.  
  6940.  
  6941.  
  6942.  
  6943.  
  6944.  
  6945.  
  6946.  
  6947.  
  6948.  
  6949.  
  6950.  
  6951.  
  6952.  
  6953.  
  6954.  
  6955.  
  6956.  
  6957.  
  6958.  
  6959.  
  6960.  
  6961.  
  6962.  
  6963.  
  6964.  
  6965.  
  6966.                                 - 111 -
  6967. ................................................................................
  6968.  
  6969.  
  6970.  
  6971.       REBUILD DIRECTORIES        UTILITY          REBUILD DIRECTORIES
  6972.  
  6973.  
  6974.       In Easy Base, all DOS file handling is taken care of for you in
  6975.       the background. To do this Easy Base maintains three
  6976.       "Directory" files in which the names which you give to forms,
  6977.       procedures and choice field lists are linked to the actual DOS
  6978.       filenames.
  6979.  
  6980.       The three files are :-
  6981.  
  6982.       BASE.DIR     The forms directory
  6983.       PROC.DIR     The procedures directory
  6984.       CHOICES.DIR  The choice list directory
  6985.  
  6986.       Because these are key files, Easy Base includes a utility which
  6987.       will rebuild them in the event of accidental erasure or
  6988.       corruption.
  6989.  
  6990.  
  6991.  
  6992.  
  6993.  
  6994.  
  6995.  
  6996.  
  6997.  
  6998.  
  6999.  
  7000.  
  7001.  
  7002.  
  7003.  
  7004.  
  7005.  
  7006.  
  7007.  
  7008.  
  7009.  
  7010.  
  7011.  
  7012.  
  7013.  
  7014.  
  7015.  
  7016.  
  7017.  
  7018.  
  7019.  
  7020.  
  7021.  
  7022.  
  7023.  
  7024.  
  7025.  
  7026.  
  7027.                                 - 112 -
  7028. ................................................................................
  7029.  
  7030.  
  7031.  
  7032.       RECORD NUMBER            SYSTEM VALUE             RECORD NUMBER
  7033.  
  7034.  
  7035.       If you derive a field with the formula "record number" it will
  7036.       be filled with the record number at the time of filing or
  7037.       reformatting.  Record number differs from "sequence" in the
  7038.       following way. Each time you derive a field with "sequence" you
  7039.       get the next sequencial number irrespective of whether the form
  7040.       has had records deleted and has been repacked. If a file has
  7041.       had at some time 500 records but now only has 20 the next
  7042.       derivation of "sequence" will be 501 and the next derivation of
  7043.       "record number" will be 21.
  7044.  
  7045.       The main use of "record number" is to renumber a set of records
  7046.       after deletions. To do this just add a new field to the form
  7047.       derived as record number. The field will be filled
  7048.       automatically during the data reformatting process.
  7049.  
  7050.       Record Number has no meaning in procedure code.
  7051.  
  7052.       See Also:-  Current Record Number
  7053.  
  7054.  
  7055.  
  7056.  
  7057.  
  7058.  
  7059.  
  7060.  
  7061.  
  7062.  
  7063.  
  7064.  
  7065.  
  7066.  
  7067.  
  7068.  
  7069.  
  7070.  
  7071.  
  7072.  
  7073.  
  7074.  
  7075.  
  7076.  
  7077.  
  7078.  
  7079.  
  7080.  
  7081.  
  7082.  
  7083.  
  7084.  
  7085.  
  7086.  
  7087.  
  7088.                                 - 113 -
  7089. ................................................................................
  7090.  
  7091.  
  7092.  
  7093.       REMARK                 PROCEDURE COMMAND                 REMARK
  7094.  
  7095.  
  7096.       You can place remarks anywhere within Easy base procedure code
  7097.       by prefixing them with an apostrophe.
  7098.  
  7099.       Ex.
  7100.  
  7101.       '.................This entire line is a remark.....
  7102.       for pupils with age > 9
  7103.          if grade = "g" then skip record   'exclude g's from count
  7104.          count = count + 1                 'These are remarks
  7105.       next
  7106.       '..............................................
  7107.  
  7108.       All text to the right of the apostrophe is ignored at run time.
  7109.  
  7110.  
  7111.  
  7112.  
  7113.  
  7114.  
  7115.  
  7116.  
  7117.  
  7118.  
  7119.  
  7120.  
  7121.  
  7122.  
  7123.  
  7124.  
  7125.  
  7126.  
  7127.  
  7128.  
  7129.  
  7130.  
  7131.  
  7132.  
  7133.  
  7134.  
  7135.  
  7136.  
  7137.  
  7138.  
  7139.  
  7140.  
  7141.  
  7142.  
  7143.  
  7144.  
  7145.  
  7146.  
  7147.  
  7148.  
  7149.                                 - 114 -
  7150. ................................................................................
  7151.  
  7152.  
  7153.  
  7154.       RESTORE                    UTILITY                      RESTORE
  7155.  
  7156.  
  7157.       Easy Base will restore applications or data which it has backed
  7158.       up. You can only restore an application with the "Restore
  7159.       Application" utility called from the utilities menu and you can
  7160.       only restore data-only backups with the "Restore Data" utility
  7161.       called from a user menu.
  7162.  
  7163.  
  7164.       See Also:-  Backup
  7165.  
  7166.  
  7167.  
  7168.  
  7169.  
  7170.  
  7171.  
  7172.  
  7173.  
  7174.  
  7175.  
  7176.  
  7177.  
  7178.  
  7179.  
  7180.  
  7181.  
  7182.  
  7183.  
  7184.  
  7185.  
  7186.  
  7187.  
  7188.  
  7189.  
  7190.  
  7191.  
  7192.  
  7193.  
  7194.  
  7195.  
  7196.  
  7197.  
  7198.  
  7199.  
  7200.  
  7201.  
  7202.  
  7203.  
  7204.  
  7205.  
  7206.  
  7207.  
  7208.  
  7209.  
  7210.                                 - 115 -
  7211. ................................................................................
  7212.  
  7213.  
  7214.  
  7215.       RETAIL                     FUNCTION                      RETAIL
  7216.  
  7217.  
  7218.       The retail function returns the retail price given the
  7219.       wholesale price and the discount as a percentage of retail.
  7220.  
  7221.       Ex   Retail(cost,discount)
  7222.  
  7223.            < returns 125 if cost = 100 and discount = 20>
  7224.  
  7225.  
  7226.  
  7227.  
  7228.  
  7229.  
  7230.  
  7231.  
  7232.  
  7233.  
  7234.  
  7235.  
  7236.  
  7237.  
  7238.  
  7239.  
  7240.  
  7241.  
  7242.  
  7243.  
  7244.  
  7245.  
  7246.  
  7247.  
  7248.  
  7249.  
  7250.  
  7251.  
  7252.  
  7253.  
  7254.  
  7255.  
  7256.  
  7257.  
  7258.  
  7259.  
  7260.  
  7261.  
  7262.  
  7263.  
  7264.  
  7265.  
  7266.  
  7267.  
  7268.  
  7269.  
  7270.  
  7271.                                 - 116 -
  7272. ................................................................................
  7273.  
  7274.  
  7275.  
  7276.       RETEST                 DERIVATION PREFIX                 RETEST
  7277.  
  7278.  
  7279.       In Easy Base, fields are derived when a new record is started
  7280.       and when any other field which affects the derivation is
  7281.       changed. You can force a field to be rederived when F2 is
  7282.       pressed by prefixing the derivation with "retest".
  7283.  
  7284.       Suppose you have a field "degrees" in which the user must enter
  7285.       a number between 1 and 360.
  7286.  
  7287.       To prevent him entering an out of range number you could derive
  7288.       the field :-
  7289.  
  7290.       If(degrees<1 or degrees > 360,blank[beepInvalid number of
  7291.       degreesCursor degrees],degrees)
  7292.  
  7293.       The above derivation would prevent the user from filing a
  7294.       record with an out of range number. However, by the time he
  7295.       read the message, his entry would be blanked out. It would be
  7296.       better if the number he had typed could be left in the field so
  7297.       that he could see his error. To do this all you have to do is
  7298.       change "blank" to "degrees" in the above derivation.
  7299.  
  7300.       This however would allow the user ( Should he decide to ignore
  7301.       the message ) to then file the incorrect value. To leave the
  7302.       value in the field and still prevent the user from filing it,
  7303.       use the "retest" prefix.
  7304.  
  7305.       Retest If(degrees<1 or degrees > 360,degrees[beepInvalid number
  7306.       of degreesCursor degrees],degrees)
  7307.  
  7308.  
  7309.       Note: You can only have one prefix on any one field derivation.
  7310.  
  7311.  
  7312.  
  7313.  
  7314.  
  7315.  
  7316.  
  7317.  
  7318.  
  7319.  
  7320.  
  7321.  
  7322.  
  7323.  
  7324.  
  7325.  
  7326.  
  7327.  
  7328.  
  7329.  
  7330.  
  7331.  
  7332.                                 - 117 -
  7333. ................................................................................
  7334.  
  7335.  
  7336.  
  7337.       REVERSE                    FUNCTION                     REVERSE
  7338.  
  7339.  
  7340.       The reverse function is used in the creation of compound index
  7341.       fields. What it actually does is alter the characters of the
  7342.       parameter in such a way that an alphabetic listing of a field
  7343.       after reversal will have the reverse order to that of the
  7344.       original characters before using the reverse function.
  7345.  
  7346.       In the example shown for the function "zeropad", had you wished
  7347.       to list the pupils in descending age order there would be no
  7348.       point in using the procedure code:
  7349.  
  7350.       for pupils with unifield in reverse order
  7351.  
  7352.       as this would not only reverse the age grouping but would also
  7353.       reverse the name order.
  7354.  
  7355.       To produce the desired printout use exactly the same procedure
  7356.       but derive "unifield" as:-
  7357.  
  7358.       Jointext(reverse(zeropad(age,2,0)),name)
  7359.  
  7360.  
  7361.  
  7362.  
  7363.  
  7364.  
  7365.  
  7366.  
  7367.  
  7368.  
  7369.  
  7370.  
  7371.  
  7372.  
  7373.  
  7374.  
  7375.  
  7376.  
  7377.  
  7378.  
  7379.  
  7380.  
  7381.  
  7382.  
  7383.  
  7384.  
  7385.  
  7386.  
  7387.  
  7388.  
  7389.  
  7390.  
  7391.  
  7392.  
  7393.                                 - 118 -
  7394. ................................................................................
  7395.  
  7396.  
  7397.  
  7398.       RIGHTTEXT                  FUNCTION                   RIGHTTEXT
  7399.  
  7400.  
  7401.       This function returns a specified number of characters from the
  7402.       end of a field or variable.
  7403.  
  7404.       Ex    Righttext(name,10)
  7405.  
  7406.  
  7407.       Ex.   Righttext(datetext(system date),4)
  7408.             < returns  1993 , 1994 Etc.>
  7409.  
  7410.  
  7411.       Acceptable parameters:
  7412.  
  7413.       Text field/variable
  7414.       Any function returning a text value
  7415.  
  7416.  
  7417.  
  7418.  
  7419.  
  7420.  
  7421.  
  7422.  
  7423.  
  7424.  
  7425.  
  7426.  
  7427.  
  7428.  
  7429.  
  7430.  
  7431.  
  7432.  
  7433.  
  7434.  
  7435.  
  7436.  
  7437.  
  7438.  
  7439.  
  7440.  
  7441.  
  7442.  
  7443.  
  7444.  
  7445.  
  7446.  
  7447.  
  7448.  
  7449.  
  7450.  
  7451.  
  7452.  
  7453.  
  7454.                                 - 119 -
  7455. ................................................................................
  7456.  
  7457.  
  7458.  
  7459.       ROUND                      FUNCTION                       ROUND
  7460.  
  7461.  
  7462.       There are three rounding functions in Easy base:-
  7463.  
  7464.       Round
  7465.       Roundup
  7466.       Rounddown
  7467.  
  7468.       If a rounding function is called with a single parameter then
  7469.       the return value is the parameter rounded to the nearest
  7470.       integer value.
  7471.  
  7472.       Ex. Round(items/reps)
  7473.          < if items = 9 and reps = 4. 2 is returned >
  7474.  
  7475.       All rounding functions accept a second parameter indicating the
  7476.       number of decimal places (or powers of 10 if negative) to round
  7477.       to.
  7478.  
  7479.       Ex. Rounddown(vaton(net),2)
  7480.          < Rounds down the VAT on field "net" to the nearest penny.
  7481.  
  7482.       Ex. Jointext(roundup(if(mod(years,100) = 0,years+1,years),-2
  7483.           )/100,"th Century")
  7484.  
  7485.         < Returns "20th Century" for all values of years 1900-1999 >
  7486.  
  7487.  
  7488.       Round Produces a default rounding system in which:-
  7489.  
  7490.          2.4 rounds to  2
  7491.          2.5 rounds to  3
  7492.         -2.4 rounds to -2
  7493.         -2.5 rounds to -3
  7494.  
  7495.       In the Roundup and Rounddown functions the direction is sign
  7496.       sensitive:-
  7497.  
  7498.          2.5 roundsup to  3      2.5 roundsdown to  2
  7499.         -2.5 roundsup to -2     -2.5 roundsdown to -3
  7500.  
  7501.       Acceptable parameters:
  7502.  
  7503.       Numeric value
  7504.       Numeric expression
  7505.       Numeric field/variable
  7506.       Any other function which returns a numeric value
  7507.  
  7508.  
  7509.  
  7510.  
  7511.  
  7512.  
  7513.  
  7514.  
  7515.                                 - 120 -
  7516. ................................................................................
  7517.  
  7518.  
  7519.  
  7520.       RUN                      FIELD CONTROL                      RUN
  7521.  
  7522.  
  7523.       The "run" control is used to initiate procedures with input
  7524.       screens without the user having to press F2.
  7525.  
  7526.       Ex.   If(lookup(customers,name) = blank,blank,lookup(customers,
  7527.             name)[run])
  7528.  
  7529.       In the above example, a procedure which lists customers
  7530.       accounts has an input screen with a single field where the
  7531.       customers name is entered. When the user enters a name the
  7532.       above derivation will test whether or not the entered name is a
  7533.       customer. If the entered name does not exist in the customers
  7534.       file the field will be blanked out but if it does then the
  7535.       procedure will run without the user having to press F2.
  7536.  
  7537.  
  7538.  
  7539.  
  7540.  
  7541.  
  7542.  
  7543.  
  7544.  
  7545.  
  7546.  
  7547.  
  7548.  
  7549.  
  7550.  
  7551.  
  7552.  
  7553.  
  7554.  
  7555.  
  7556.  
  7557.  
  7558.  
  7559.  
  7560.  
  7561.  
  7562.  
  7563.  
  7564.  
  7565.  
  7566.  
  7567.  
  7568.  
  7569.  
  7570.  
  7571.  
  7572.  
  7573.  
  7574.  
  7575.  
  7576.                                 - 121 -
  7577. ................................................................................
  7578.  
  7579.  
  7580.  
  7581.       RUNTIME AUTO START          METHOD           RUNTIME AUTO START
  7582.  
  7583.  
  7584.       If you intend to distribute an application using the Easy Base
  7585.       Runtime Module, you can have the module start automatically on
  7586.       a particular user menu by giving that menu the sign on password
  7587.       "Autostart".
  7588.  
  7589.       Each time the runtime module starts it searches for a menu with
  7590.       this password. If it finds one, it skips the sign on screen and
  7591.       starts automatically on this menu.
  7592.  
  7593.       The "Autostart" password has no significance while developing
  7594.       in Easy Base. It is treated as any other sign on password.
  7595.  
  7596.  
  7597.  
  7598.  
  7599.  
  7600.  
  7601.  
  7602.  
  7603.  
  7604.  
  7605.  
  7606.  
  7607.  
  7608.  
  7609.  
  7610.  
  7611.  
  7612.  
  7613.  
  7614.  
  7615.  
  7616.  
  7617.  
  7618.  
  7619.  
  7620.  
  7621.  
  7622.  
  7623.  
  7624.  
  7625.  
  7626.  
  7627.  
  7628.  
  7629.  
  7630.  
  7631.  
  7632.  
  7633.  
  7634.  
  7635.  
  7636.  
  7637.                                 - 122 -
  7638. ................................................................................
  7639.  
  7640.  
  7641.  
  7642.       SCREEN COLOURS             UTILITY               SCREEN COLOURS
  7643.  
  7644.  
  7645.       The "Screen Colours" utility provides 14 pre defined colour
  7646.       sets including two for "Mono Graphics" cards together with a
  7647.       user defined setup. To change the colours of your system simply
  7648.       select "Screen Colours" from the Utilities menu and select the
  7649.       set you want.
  7650.  
  7651.       The "Screen Colours" utility can also be called as a User Menu
  7652.       function allowing an end user to change his screen set from
  7653.       your menus without accessing the system.
  7654.  
  7655.  
  7656.  
  7657.  
  7658.  
  7659.  
  7660.  
  7661.  
  7662.  
  7663.  
  7664.  
  7665.  
  7666.  
  7667.  
  7668.  
  7669.  
  7670.  
  7671.  
  7672.  
  7673.  
  7674.  
  7675.  
  7676.  
  7677.  
  7678.  
  7679.  
  7680.  
  7681.  
  7682.  
  7683.  
  7684.  
  7685.  
  7686.  
  7687.  
  7688.  
  7689.  
  7690.  
  7691.  
  7692.  
  7693.  
  7694.  
  7695.  
  7696.  
  7697.  
  7698.                                 - 123 -
  7699. ................................................................................
  7700.  
  7701.  
  7702.  
  7703.       SECONDS                    FUNCTION                     SECONDS
  7704.  
  7705.  
  7706.       This function returns the seconds number from the time
  7707.       parameter.
  7708.  
  7709.       Ex.    seconds(system time)
  7710.  
  7711.  
  7712.       Acceptable parameters:
  7713.  
  7714.       System time
  7715.       Time field
  7716.       Maketime function
  7717.       Time expression
  7718.  
  7719.  
  7720.  
  7721.  
  7722.  
  7723.  
  7724.  
  7725.  
  7726.  
  7727.  
  7728.  
  7729.  
  7730.  
  7731.  
  7732.  
  7733.  
  7734.  
  7735.  
  7736.  
  7737.  
  7738.  
  7739.  
  7740.  
  7741.  
  7742.  
  7743.  
  7744.  
  7745.  
  7746.  
  7747.  
  7748.  
  7749.  
  7750.  
  7751.  
  7752.  
  7753.  
  7754.  
  7755.  
  7756.  
  7757.  
  7758.  
  7759.                                 - 124 -
  7760. ................................................................................
  7761.  
  7762.  
  7763.  
  7764.       SEQUENCE                 SYSTEM VALUE                  SEQUENCE
  7765.  
  7766.  
  7767.       When you create a new form a sequence value is updated each
  7768.       time a record is entered. The "sequence" value starts at 1 and
  7769.       continues to 2 billion irrespective of whether or not records
  7770.       have been deleted from the form. If you derive a field as
  7771.       "sequence" then each new record will have the next sequenced
  7772.       number. Sequence derivations are useful for such things as
  7773.       invoice numbers.
  7774.  
  7775.       A sequence field need not start at one however.
  7776.  
  7777.       Ex.  sequence + 1000 would number the first record 1001
  7778.  
  7779.       The sequence value is only available in data entry to a form.
  7780.       A common problem in data systems is to produce a sequence
  7781.       number when records are entered to forms via procedures.
  7782.  
  7783.       To accomplish this define fields to hold the number on both the
  7784.       form and the procedure input screen. Also define a single
  7785.       character text field, let's call it x on both. This field can
  7786.       be invisible. The x field in the form is indexed but not
  7787.       derived. The x field on the input screen is derived as "x".
  7788.       A relationship, let's call it "invoice" is entered between the
  7789.       input screen and the form relating the two "x" fields.
  7790.       Assuming the fields for the sequence number are called "invno"
  7791.       the field on the input screen is derived as:-
  7792.  
  7793.          lookup(invoice,invno)+ 1
  7794.  
  7795.       To update the x field in the form which is used purely as a
  7796.       flag to mark the last record your procedure code would be
  7797.       something like:-
  7798.  
  7799.       for invoices with x = "x"
  7800.          invoices.x = blank
  7801.          update record
  7802.       next
  7803.       for invoices new record
  7804.          copy all from input
  7805.       next
  7806.  
  7807.  
  7808.  
  7809.  
  7810.  
  7811.  
  7812.  
  7813.  
  7814.  
  7815.  
  7816.  
  7817.  
  7818.  
  7819.  
  7820.                                 - 125 -
  7821. ................................................................................
  7822.  
  7823.  
  7824.  
  7825.       SET PAPER LENGTH           UTILITY             SET PAPER LENGTH
  7826.  
  7827.  
  7828.       The "Set Paper Length" utility is accessed from the
  7829.       Utilities menu and can also be called from a user menu.
  7830.  
  7831.       There are settings for A3, A4, A5, American Letter and
  7832.       American Legal in both portrait and landscape.
  7833.  
  7834.       When you change the paper length in use then you update
  7835.       pagination for all report outputs.
  7836.  
  7837.       The landscape options are for use in wide carriage printers
  7838.       where the paper can be fed in landscape orientation they do not
  7839.       produce "sideways" printing on narrow carriage printers.
  7840.  
  7841.  
  7842.  
  7843.  
  7844.  
  7845.  
  7846.  
  7847.  
  7848.  
  7849.  
  7850.  
  7851.  
  7852.  
  7853.  
  7854.  
  7855.  
  7856.  
  7857.  
  7858.  
  7859.  
  7860.  
  7861.  
  7862.  
  7863.  
  7864.  
  7865.  
  7866.  
  7867.  
  7868.  
  7869.  
  7870.  
  7871.  
  7872.  
  7873.  
  7874.  
  7875.  
  7876.  
  7877.  
  7878.  
  7879.  
  7880.  
  7881.                                 - 126 -
  7882. ................................................................................
  7883.  
  7884.  
  7885.  
  7886.       SET SYSTEM VALUES           METHOD            SET SYSTEM VALUES
  7887.  
  7888.  
  7889.       The System values System date, System Time and Output can be
  7890.       set within procedure code.
  7891.  
  7892.       Ex.
  7893.          System Date = input.date
  7894.       Ex.
  7895.          If input.print = "Yes" then Output = "Printer"
  7896.  
  7897.       Setting the output from an input screen field means that the
  7898.       user can change the output destination without having to exit
  7899.       back to the menu in procedures which have repeating input
  7900.       screens.
  7901.  
  7902.       If you have several procedures which are individually run to
  7903.       the screen but you also wish to batch execute them to the
  7904.       printer, you can achieve this by including the line:-
  7905.  
  7906.          If Global number = 2 then output = "Printer"
  7907.  
  7908.       then placing the procedures on a batch execute menu which
  7909.       begins with a procedure setting Global Number to 2. and ends
  7910.       with one re setting it to zero.
  7911.  
  7912.  
  7913.  
  7914.  
  7915.  
  7916.  
  7917.  
  7918.  
  7919.  
  7920.  
  7921.  
  7922.  
  7923.  
  7924.  
  7925.  
  7926.  
  7927.  
  7928.  
  7929.  
  7930.  
  7931.  
  7932.  
  7933.  
  7934.  
  7935.  
  7936.  
  7937.  
  7938.  
  7939.  
  7940.  
  7941.  
  7942.                                 - 127 -
  7943. ................................................................................
  7944.  
  7945.  
  7946.  
  7947.       SKIP GROUP             PROCEDURE COMMAND             SKIP GROUP
  7948.  
  7949.  
  7950.       The "Skip Group" command excludes an entire group of records
  7951.       from selection by a "For" loop.
  7952.  
  7953.       Ex.
  7954.  
  7955.       for employees with type in order
  7956.          if employees.type = "Part time" then skip group
  7957.          print list items
  7958.       next
  7959.  
  7960.       The "Skip Group" command is not the same as filtering with a
  7961.       "<>" condition.  You could achieve the same result with :-
  7962.  
  7963.       for employees with type in order
  7964.          if employees.type <> "Part time" then
  7965.             print list items
  7966.          end if
  7967.       next
  7968.  
  7969.       but the second procedure would take much longer to run as each
  7970.       part time employee's record would be loaded into memory only to
  7971.       be rejected by the "If" condition.  The first procedure on the
  7972.       other hand only loads a single part time employee's record then
  7973.       skips the entire group by advancing the index pointer in use
  7974.       for record selection.
  7975.  
  7976.       You can also use the "Skip Group" command to terminate
  7977.       selection of a group of records at a given point.
  7978.  
  7979.       declare variables
  7980.          count as number
  7981.       end
  7982.       for employees with type in order
  7983.          count = count + 1
  7984.          if count = 51 then
  7985.             count = 0
  7986.             skip group
  7987.          end if
  7988.          print list items
  7989.       next
  7990.  
  7991.       The above procedure prints the first fifty employees in each
  7992.       "type" group.
  7993.  
  7994.       The "Skip Group" command can be shortened to "Skipgrp"
  7995.  
  7996.       IMPORTANT: The condition for the Skip Group cannot be nested
  7997.       within another "If" condition or "DO LOOP" structure which is
  7998.       itself within the current "For" loop.
  7999.  
  8000.       :- See Skip Record for example.
  8001.  
  8002.  
  8003.                                 - 128 -
  8004. ................................................................................
  8005.  
  8006.  
  8007.  
  8008.       SKIP RECORD            PROCEDURE COMMAND            SKIP RECORD
  8009.  
  8010.  
  8011.       The "Skip Record" command is used to exclude individual records
  8012.       from selection in a "For" Loop.
  8013.  
  8014.       Ex.
  8015.  
  8016.       for employee with worksno in order
  8017.          if employees.worksno = 12 then skip record
  8018.          print list items
  8019.       next
  8020.  
  8021.       The "Skip Record" command has exactly the same effect as
  8022.       filtering with a "<>" condition but is much easier to write if
  8023.       there are many items to exclude
  8024.  
  8025.       for employees with worksno in order
  8026.          if employees.worksno = 12 or employees.worksno = 15 then
  8027.             skip record
  8028.          end if
  8029.          if employees.name = "smith" then skip record
  8030.          if employees.age > 50 then skip record
  8031.       next
  8032.  
  8033.       You can exclude groups of records from an inner loop by
  8034.       applying the "Skip Record" command to a "Unique" outer loop.
  8035.  
  8036.       for employees alias types with type in order unique
  8037.          if types.type = "director" then skip record
  8038.          if types.type = "part time" then skip record
  8039.          for employees with type = types.type
  8040.             print list items
  8041.          next
  8042.       next
  8043.  
  8044.       If you need to exclude groups of records from a single loop you
  8045.       must use the "Skip Group" command.
  8046.  
  8047.       The "Skip Record" command can be shortened to "Skiprec".
  8048.  
  8049.       IMPORTANT:
  8050.  
  8051.       The Skip Record command causes a direct jump to the start of
  8052.       the next iteration of the current "For" loop. The condition
  8053.       for the Skip Record must not be nested within another "If"
  8054.       condition or "Do Loop" structure which is itself within the
  8055.       current For loop.
  8056.  
  8057.       for form
  8058.          if (condition) then
  8059.             if form.type = "Part time" then skip record
  8060.          end if
  8061.       next
  8062.                    This will cause a system error.
  8063.  
  8064.                                 - 129 -
  8065. ................................................................................
  8066.  
  8067.  
  8068.  
  8069.       SPACEPAD                   FUNCTION                    SPACEPAD
  8070.  
  8071.  
  8072.       The Spacepad function pads a text variable to a given length
  8073.       with spaces.
  8074.  
  8075.       Ex.   Spacepad(name,10)
  8076.             < returns "Fred      " if name = "Fred"
  8077.  
  8078.       The spacepad function is used in the creation of compound index
  8079.       fields.
  8080.  
  8081.       For example:    A "Films" form has the fields "title" and
  8082.       "category". To list the films grouped by category in order and
  8083.       with the titles in each category in order create the field
  8084.       "groupindex" as text,long enough to hold both category and
  8085.       title fields and derived as :-
  8086.  
  8087.       Jointext(spacepad(category,15),title)
  8088.                       {15 is length of category field}
  8089.  
  8090.       You can then produce the required printout with the following
  8091.  
  8092.       procedure.
  8093.  
  8094.       ....................format.........................
  8095.  
  8096.       .Report header
  8097.         ═══════════════════════════════════════════════════════════
  8098.                        FILM LIST BY CATEGORY
  8099.         ═══════════════════════════════════════════════════════════
  8100.       .Group header
  8101.         Films in {category field}
  8102.       .List items
  8103.        {title field} Starring {Star field} Running time {length Fld}
  8104.       .end
  8105.  
  8106.       ......................procedure code.................
  8107.       declare output fields
  8108.          films.title:films.star:films.length:films.category
  8109.       end
  8110.       declare variables
  8111.          catcheck as text
  8112.       end
  8113.       '............
  8114.       bold on
  8115.       print report header
  8116.       for films with groupindex in order
  8117.          if films.category <> catcheck then
  8118.             bold on
  8119.             print group header
  8120.             bold off
  8121.          end if
  8122.          print list items
  8123.       next
  8124.  
  8125.                                 - 130 -
  8126. ................................................................................
  8127.  
  8128.  
  8129.  
  8130.       SPELLDAY                   FUNCTION                    SPELLDAY
  8131.  
  8132.  
  8133.       This function spells out the day of the number (1-7) parameter.
  8134.  
  8135.       Ex.   Spellday(dayofweek(system date))
  8136.  
  8137.  
  8138.       Acceptable parameters:
  8139.  
  8140.       Numeric value                              (1-7)
  8141.       Numeric expression evaluating to           (1-7)
  8142.       Numeric Field/variable holding value       (1-7)
  8143.       Any function returning a numeric value     (1-7)
  8144.  
  8145.  
  8146.  
  8147.  
  8148.  
  8149.  
  8150.  
  8151.  
  8152.  
  8153.  
  8154.  
  8155.  
  8156.  
  8157.  
  8158.  
  8159.  
  8160.  
  8161.  
  8162.  
  8163.  
  8164.  
  8165.  
  8166.  
  8167.  
  8168.  
  8169.  
  8170.  
  8171.  
  8172.  
  8173.  
  8174.  
  8175.  
  8176.  
  8177.  
  8178.  
  8179.  
  8180.  
  8181.  
  8182.  
  8183.  
  8184.  
  8185.  
  8186.                                 - 131 -
  8187. ................................................................................
  8188.  
  8189.  
  8190.  
  8191.       SPELLMONTH                 FUNCTION                  SPELLMONTH
  8192.  
  8193.  
  8194.       This function spells out the day of the number (1-12)
  8195.       parameter.
  8196.  
  8197.  
  8198.       Ex.   Spellmonth(month(system date))
  8199.  
  8200.       Ex.   Month = Spellmonth(month(invoices.date))
  8201.  
  8202.  
  8203.       Acceptable parameters:
  8204.  
  8205.       Numeric value                           (1-12)
  8206.       Numeric expression evaluating to        (1-12)
  8207.       Numeric Field/variable holding value    (1-12)
  8208.       Any function returning a numeric value  (1-12)
  8209.  
  8210.  
  8211.  
  8212.  
  8213.  
  8214.  
  8215.  
  8216.  
  8217.  
  8218.  
  8219.  
  8220.  
  8221.  
  8222.  
  8223.  
  8224.  
  8225.  
  8226.  
  8227.  
  8228.  
  8229.  
  8230.  
  8231.  
  8232.  
  8233.  
  8234.  
  8235.  
  8236.  
  8237.  
  8238.  
  8239.  
  8240.  
  8241.  
  8242.  
  8243.  
  8244.  
  8245.  
  8246.  
  8247.                                 - 132 -
  8248. ................................................................................
  8249.  
  8250.  
  8251.  
  8252.       START HERE             DERIVATION PREFIX             START HERE
  8253.  
  8254.  
  8255.       If, in a form or procedure input screen, you want the cursor to
  8256.       start in other than the top left field then derive the field in
  8257.       which you wish the cursor to start with "Start here" .
  8258.  
  8259.       If the field in which the cursor is to start already has a
  8260.       derivation then simply prefix the derivation with "Start here".
  8261.  
  8262.       Ex.
  8263.  
  8264.       start here Lookup(customers,name)
  8265.  
  8266.  
  8267.  
  8268.       Note: You can only have one prefix on any one field derivation.
  8269.  
  8270.  
  8271.  
  8272.  
  8273.  
  8274.  
  8275.  
  8276.  
  8277.  
  8278.  
  8279.  
  8280.  
  8281.  
  8282.  
  8283.  
  8284.  
  8285.  
  8286.  
  8287.  
  8288.  
  8289.  
  8290.  
  8291.  
  8292.  
  8293.  
  8294.  
  8295.  
  8296.  
  8297.  
  8298.  
  8299.  
  8300.  
  8301.  
  8302.  
  8303.  
  8304.  
  8305.  
  8306.  
  8307.  
  8308.                                 - 133 -
  8309. ................................................................................
  8310.  
  8311.  
  8312.  
  8313.       STRINGOF                   FUNCTION                    STRINGOF
  8314.  
  8315.  
  8316.       This function returns a string of characters.
  8317.  
  8318.       Ex.   Stringof(12,"-")
  8319.              < Returns "------------">
  8320.  
  8321.  
  8322.       Ex.  Stringof(5,chr$(240))
  8323.             < Returns "≡≡≡≡≡">
  8324.  
  8325.  
  8326.       One of the most useful applications of the "Stringof" function
  8327.       is to pad output fields in tabular reports with "." characters.
  8328.  
  8329.       Ex.
  8330.  
  8331.       Declare output fields
  8332.          stock.name : stock.price
  8333.       end
  8334.       for stock with name in order
  8335.          stock.name = jointext(stock.name,stringof(30-lengthtext(
  8336.                       stock.name),".")
  8337.          print list items
  8338.       next
  8339.  
  8340.  
  8341.       The printed output from the above report would be in the form:-
  8342.  
  8343.             Gizmo.........................  2.50
  8344.             Sprocket......................  9.95
  8345.             Widget........................  3.10
  8346.  
  8347.  
  8348.  
  8349.       Acceptable parameters:
  8350.  
  8351.       1   Any numeric field, variable, expression or function
  8352.       2   Single quoted character - Function returning a single
  8353.           character
  8354.  
  8355.  
  8356.  
  8357.  
  8358.  
  8359.  
  8360.  
  8361.  
  8362.  
  8363.  
  8364.  
  8365.  
  8366.  
  8367.  
  8368.  
  8369.                                 - 134 -
  8370. ................................................................................
  8371.  
  8372.  
  8373.  
  8374.       SUBINDEX               PROCEDURE COMMAND               SUBINDEX
  8375.  
  8376.  
  8377.       If you need to list records from a form in such a way that they
  8378.       are in groups but with each group in order, there are two ways
  8379.       to accomplish this. You can include a compound index field on
  8380.       the form or you can "subindex" the group during the procedure.
  8381.       The advantage of having a compound index is that no time is
  8382.       wasted "sorting" the sub group during any procedure that uses
  8383.       it and the disadvantage is that it uses extra disk space. As a
  8384.       general rule you should use a compound index where the sub
  8385.       groups are likely to be large and "subindex" during the
  8386.       procedure only if each sub group has up to a few dozen or so
  8387.       records or if you need to order unnatural groupings.
  8388.  
  8389.       Ex.
  8390.  
  8391.       for pupils alias agegroups with age in order unique
  8392.          for pupils alias sortgroup with age = agegroups.age
  8393.             subindex name
  8394.          next
  8395.          for pupils with subindex in order
  8396.             print list items
  8397.          next
  8398.       next
  8399.  
  8400.       The grouping can be extended to more than one level. The
  8401.       following example lists records from a "Videos" form grouped
  8402.       by rental price then by category and with the sub sub group
  8403.       titles in alphabetic order.
  8404.  
  8405.       for videos alias pricegroups with price in order unique
  8406.          for videos alias catgroups with category in order unique
  8407.             for videos alias group with category = catgroups.category
  8408.                if group.price = pricegroups.price then
  8409.                   subindex title
  8410.                end if
  8411.             next
  8412.             for videos with subindex in order
  8413.                print list items
  8414.             next
  8415.          next
  8416.       next
  8417.  
  8418.       As you can see from the listing the output from these examples
  8419.       has to pause between groups while the subindex is written. If
  8420.       you have a 66 Mhz PC and there are twenty records in the sub
  8421.       group you probably won't notice but if you have a 12 Mhz
  8422.       machine and there are a thousand records in the sub group you
  8423.       may as well break for lunch!  If you write a "subindexing"
  8424.       procedure and find that the "Sorting" time is unacceptable then
  8425.       add a compound index field to the form.
  8426.  
  8427.  
  8428.  
  8429.  
  8430.                                 - 135 -
  8431. ................................................................................
  8432.  
  8433.  
  8434.  
  8435.       SUBINDEX               PROCEDURE COMMAND               SUBINDEX
  8436.  
  8437.  
  8438.       Although using compound index fields to produce group ordering
  8439.       is normally preferable to using "Subindex", there is one
  8440.       important area where "Subindex" is more flexible. That is where
  8441.       you need to order records in unnatural groups.
  8442.  
  8443.       Consider the "Videos" form which has fields for "Title" ,
  8444.       "RentalPrice" and "Category".
  8445.  
  8446.       Natural Groupings would be:-
  8447.  
  8448.       Titles with RentalPrice = £2
  8449.       Titles with Category = "Comedy"
  8450.       Titles with RentalPrice = £2 and category = "Horror"
  8451.  
  8452.       Unnatural groupings would be :-
  8453.  
  8454.       Titles with RentalPrice = £2 or Rentalprice = £1.50
  8455.       Titles With RentalPrice = £1.50 or Category = "Western"
  8456.  
  8457.       Although you can make compound index fields to produce
  8458.       unnatural groupings they are not flexible - You need a separate
  8459.       compound index for each unnatural group.
  8460.  
  8461.       If you wished to write a procedure which allowed the user to
  8462.       enter any two video "Categories" and have all titles with
  8463.       either of those two categories listed in order then you must
  8464.       use "Subindex".
  8465.  
  8466.       Ex.
  8467.  
  8468.       for videos alias cat1 with category = input.cat1
  8469.          subindex title
  8470.       next
  8471.       for videos alias cat2 with category = input.cat2
  8472.          subindex title
  8473.       next
  8474.       for videos with subindex in order
  8475.          print list items
  8476.       next
  8477.  
  8478.       You will notice in the above example that two "For" loops add
  8479.       records to the "Subindex" before it is used. Once you start a
  8480.       subindex you can add records to it as often as you wish before
  8481.       using it. Once you use it it is erased.
  8482.  
  8483.       You can only have one "Subindex" active at any time. You can
  8484.       use any number of "Subindexes" within one procedure but each
  8485.       one must be "used" before the next is started.
  8486.  
  8487.  
  8488.  
  8489.  
  8490.  
  8491.                                 - 136 -
  8492. ................................................................................
  8493.  
  8494.  
  8495.  
  8496.       SYSTEM DATE              SYSTEM VALUE               SYSTEM DATE
  8497.  
  8498.  
  8499.       You can use your computers inbuilt date anywhere in field
  8500.       derivations or procedure code by simply quoting "system date".
  8501.  
  8502.       Ex.
  8503.  
  8504.       for diary with date = system date
  8505.          print list items
  8506.       next
  8507.  
  8508.  
  8509.  
  8510.  
  8511.  
  8512.  
  8513.  
  8514.  
  8515.  
  8516.  
  8517.  
  8518.  
  8519.  
  8520.  
  8521.  
  8522.  
  8523.  
  8524.  
  8525.  
  8526.  
  8527.  
  8528.  
  8529.  
  8530.  
  8531.  
  8532.  
  8533.  
  8534.  
  8535.  
  8536.  
  8537.  
  8538.  
  8539.  
  8540.  
  8541.  
  8542.  
  8543.  
  8544.  
  8545.  
  8546.  
  8547.  
  8548.  
  8549.  
  8550.  
  8551.  
  8552.                                 - 137 -
  8553. ................................................................................
  8554.  
  8555.  
  8556.  
  8557.       SYSTEM TIME              SYSTEM VALUE               SYSTEM TIME
  8558.  
  8559.  
  8560.       You can use your computers inbuilt time anywhere in field
  8561.       derivations or procedure code by simply quoting "system time".
  8562.  
  8563.       Ex.
  8564.  
  8565.       for stockitems with stockno = input.stockno
  8566.          lastcheckeddate = system date
  8567.          lastcheckedtime = system time
  8568.          update record
  8569.       next
  8570.  
  8571.  
  8572.  
  8573.  
  8574.  
  8575.  
  8576.  
  8577.  
  8578.  
  8579.  
  8580.  
  8581.  
  8582.  
  8583.  
  8584.  
  8585.  
  8586.  
  8587.  
  8588.  
  8589.  
  8590.  
  8591.  
  8592.  
  8593.  
  8594.  
  8595.  
  8596.  
  8597.  
  8598.  
  8599.  
  8600.  
  8601.  
  8602.  
  8603.  
  8604.  
  8605.  
  8606.  
  8607.  
  8608.  
  8609.  
  8610.  
  8611.  
  8612.  
  8613.                                 - 138 -
  8614. ................................................................................
  8615.  
  8616.  
  8617.  
  8618.       TABULATION                  METHOD                   TABULATION
  8619.  
  8620.  
  8621.       To create a printout in which fields are enclosed within a
  8622.       lined table use the linedrawing facility in the format editor
  8623.       to create a page header and page footer containing the top and
  8624.       bottom of the table and insert only the vertical lines between
  8625.       the fields in the list items section.
  8626.  
  8627.       Ex.
  8628.  
  8629.       Declare output fields
  8630.          stock.name : stock.price
  8631.       end
  8632.       print page header
  8633.       for stock with name in order
  8634.          if bottom margin < 0.7 then
  8635.             print page footer
  8636.             page feed
  8637.             print page header
  8638.          end if
  8639.          print list items
  8640.       next
  8641.       print page footer
  8642.       Page feed
  8643.  
  8644.       ........................format.........................
  8645.  
  8646.       .page header
  8647.             ╔════════════════════╤═══════════════╗
  8648.             ║ Name               │  Price        ║
  8649.             ╠════════════════════╪═══════════════╣
  8650.       .list items
  8651.             ║ {Name Field     }  │ {Price Fld. } ║
  8652.       .page footer
  8653.             ╚════════════════════╧═══════════════╝
  8654.       .end
  8655.  
  8656.  
  8657.  
  8658.  
  8659.  
  8660.  
  8661.  
  8662.  
  8663.  
  8664.  
  8665.  
  8666.  
  8667.  
  8668.  
  8669.  
  8670.  
  8671.  
  8672.  
  8673.  
  8674.                                 - 139 -
  8675. ................................................................................
  8676.  
  8677.  
  8678.  
  8679.       TEXT                      FIELD TYPE                       TEXT
  8680.  
  8681.  
  8682.       The text field type can be up to 80 characters long.
  8683.  
  8684.       Cut copy and paste operations are available between all text,
  8685.       and textblock fields :
  8686.  
  8687.       Use Shift plus the arrow keys to mark the text you wish to cut
  8688.       or copy. When you release the keys the cut or copy choice will
  8689.       appear.
  8690.  
  8691.       To paste cut text position the cursor where you want it
  8692.       inserted and press Shift plus Ins.
  8693.  
  8694.       Spell Checking is also available in text fields -
  8695.          Press Ctrl + S
  8696.  
  8697.  
  8698.  
  8699.  
  8700.  
  8701.  
  8702.  
  8703.  
  8704.  
  8705.  
  8706.  
  8707.  
  8708.  
  8709.  
  8710.  
  8711.  
  8712.  
  8713.  
  8714.  
  8715.  
  8716.  
  8717.  
  8718.  
  8719.  
  8720.  
  8721.  
  8722.  
  8723.  
  8724.  
  8725.  
  8726.  
  8727.  
  8728.  
  8729.  
  8730.  
  8731.  
  8732.  
  8733.  
  8734.  
  8735.                                 - 140 -
  8736. ................................................................................
  8737.  
  8738.  
  8739.  
  8740.       TEXT BLOCK                FIELD TYPE                 TEXT BLOCK
  8741.  
  8742.  
  8743.       When you Define a field with the field type "Text Block" then
  8744.       instead of entering a field length you shade out the area which
  8745.       you wish the field to cover using the arrow keys.
  8746.  
  8747.       Textblock fields offer many of the facilities of a
  8748.       wordprocessor including cut and paste, wordwrap and spell
  8749.       checking.
  8750.  
  8751.       Useful widths for A4 and Letter size paper are 63 characters if
  8752.       you intend to print at 10 characters per inch and 75 characters
  8753.       if you intend to print at 12 characters per inch. This document
  8754.       for instance was created in 63 character wide text blocks.
  8755.  
  8756.       The maximum width of a text block field on screen is 80
  8757.       characters. You can however redefine it up to 230 characters
  8758.       wide in procedure printouts and Easy Base will reformat your
  8759.       paragraphs to the new width.
  8760.  
  8761.       A text block field is not a "memo" field. It can be indexed and
  8762.       derived.
  8763.  
  8764.  
  8765.  
  8766.  
  8767.  
  8768.  
  8769.  
  8770.  
  8771.  
  8772.  
  8773.  
  8774.  
  8775.  
  8776.  
  8777.  
  8778.  
  8779.  
  8780.  
  8781.  
  8782.  
  8783.  
  8784.  
  8785.  
  8786.  
  8787.  
  8788.  
  8789.  
  8790.  
  8791.  
  8792.  
  8793.  
  8794.  
  8795.  
  8796.                                 - 141 -
  8797. ................................................................................
  8798.  
  8799.  
  8800.  
  8801.       TIME                      FIELD TYPE                       TIME
  8802.  
  8803.  
  8804.       The Easy Base "time" field has the eight character format:-
  8805.  
  8806.       11:20:20    (Hours:Minutes:Seconds)
  8807.  
  8808.       You can record time data in any format you wish by using a
  8809.       "Formatted Text" field but you must use a "Time" field if you
  8810.       wish to perform addition and subtraction operations on time
  8811.       values.  (in seconds)
  8812.  
  8813.       Time fields are automatically checked for validity.
  8814.  
  8815.  
  8816.       See Also:-  Maketime
  8817.  
  8818.  
  8819.  
  8820.  
  8821.  
  8822.  
  8823.  
  8824.  
  8825.  
  8826.  
  8827.  
  8828.  
  8829.  
  8830.  
  8831.  
  8832.  
  8833.  
  8834.  
  8835.  
  8836.  
  8837.  
  8838.  
  8839.  
  8840.  
  8841.  
  8842.  
  8843.  
  8844.  
  8845.  
  8846.  
  8847.  
  8848.  
  8849.  
  8850.  
  8851.  
  8852.  
  8853.  
  8854.  
  8855.  
  8856.  
  8857.                                 - 142 -
  8858. ................................................................................
  8859.  
  8860.  
  8861.  
  8862.       TIMEAMPM                   FUNCTION                    TIMEAMPM
  8863.  
  8864.  
  8865.       This function returns the hour ( 0 - 12) plus am. or pm. from
  8866.       the time field parameter.
  8867.  
  8868.       Ex. Timeampm(system time)
  8869.  
  8870.       Ex.
  8871.       -------------------------format----------------------------
  8872.       .Report header
  8873.                      Appointments for {Apps.Date Field}
  8874.       .List items
  8875.                 {Apps.Name Field      }   at  {Time Field}
  8876.       .End
  8877.       -------------------------code----------------------------
  8878.       declare output fields
  8879.          Apps.name
  8880.          Apps.date
  8881.          Time
  8882.       end
  8883.       print report header
  8884.       for apps with date = system date
  8885.          time = timeampm(apps.time)
  8886.          print list items
  8887.       next
  8888.  
  8889.  
  8890.       Acceptable parameters:
  8891.  
  8892.       System time
  8893.       Time field
  8894.       Maketime function
  8895.       Time expression
  8896.  
  8897.  
  8898.  
  8899.  
  8900.  
  8901.  
  8902.  
  8903.  
  8904.  
  8905.  
  8906.  
  8907.  
  8908.  
  8909.  
  8910.  
  8911.  
  8912.  
  8913.  
  8914.  
  8915.  
  8916.  
  8917.  
  8918.                                 - 143 -
  8919. ................................................................................
  8920.  
  8921.  
  8922.  
  8923.       TOTAL COPIES             SYSTEM VALUE              TOTAL COPIES
  8924.  
  8925.  
  8926.       Whenever a procedure enters a "FOR" loop qualified by "With
  8927.       fieldname = " the total number of records which match the
  8928.       qualification value is available in the system value "Total
  8929.       Copies"
  8930.  
  8931.       Total Copies is extracted directly from the index file and
  8932.       relieves you of a time consuming loop all the way through a
  8933.       form updating a counter.
  8934.  
  8935.       In other words:-
  8936.  
  8937.       for books with category = "fiction"
  8938.          count = count + 1
  8939.       next
  8940.  
  8941.       can be replaced with:-
  8942.  
  8943.       for books with category = "fiction"
  8944.          count = total copies
  8945.          exit for
  8946.       next
  8947.  
  8948.       Unlike "Total Records" the "Total Copies" value never includes
  8949.       records marked for deletion.
  8950.  
  8951.       Easy Base does not track separate values for "Total Records" or
  8952.       "Total Copies" when there are nested "For" loops. The values
  8953.       are set for the outer loop on the first iteration and reset for
  8954.       the inner loop on its first iteration. If you need a value for
  8955.       "Total Records" or for "Total Copies" after your procedure has
  8956.       entered another loop then you must transfer the value to a
  8957.       variable while it is available. (See the example for "Display
  8958.       Status")
  8959.  
  8960.       Easy Base does not update "Total Records" or "Total Copies"
  8961.       when records are added or deleted during a procedure.
  8962.  
  8963.  
  8964.  
  8965.  
  8966.  
  8967.  
  8968.  
  8969.  
  8970.  
  8971.  
  8972.  
  8973.  
  8974.  
  8975.  
  8976.  
  8977.  
  8978.  
  8979.                                 - 144 -
  8980. ................................................................................
  8981.  
  8982.  
  8983.  
  8984.       TOTAL RECORDS            SYSTEM VALUE             TOTAL RECORDS
  8985.  
  8986.  
  8987.       Whenever a procedure enters a "FOR" loop the total number of
  8988.       records in the form is available in the system value "Total
  8989.       records"
  8990.  
  8991.       Ex.
  8992.       The following code fragment updates a "Customer summary" form
  8993.       with the total number of customers in the "Customers" form.
  8994.  
  8995.       declare variables
  8996.         tot as number
  8997.       end
  8998.       for customers with acno = 1
  8999.          tot = total records
  9000.          exit for
  9001.       next
  9002.       for customersummary
  9003.          customersummary.totalcustomers = tot
  9004.          update record
  9005.       next
  9006.  
  9007.       Caution.
  9008.  
  9009.       Provided that the "For" loop is qualified by a "with" statement
  9010.       then the "Total Records" value is extracted directly from the
  9011.       open index file and is the total number of "Live Records".
  9012.  
  9013.       If you access the "Total records" value in an unqualified "For"
  9014.       loop then there is no index file open and the "Total Records"
  9015.       value is derived by dividing the forms file length by the
  9016.       record length. It therefore represents the total number of
  9017.       records in the form "Live" and "Deleted".
  9018.  
  9019.       Ex.
  9020.  
  9021.       If a form "books" has 2000 records and 10 are marked for
  9022.       deletion at the next re-pack then "count" returns 1990 in:-
  9023.  
  9024.       for books with catalogueno = 1
  9025.         count = total records
  9026.       next
  9027.  
  9028.       and 2000 in :-
  9029.  
  9030.       for books
  9031.          count = total records
  9032.          exit for
  9033.       next
  9034.  
  9035.  
  9036.  
  9037.  
  9038.  
  9039.  
  9040.                                 - 145 -
  9041. ................................................................................
  9042.  
  9043.  
  9044.  
  9045.       TOTALS & SUB TOTALS         METHOD          TOTALS & SUB TOTALS
  9046.  
  9047.  
  9048.       To produce totals and sub totals in printouts use ad hoc fields
  9049.       to hold the values and increment them during each iteration of
  9050.       the output loops. The following code lists all entries in a
  9051.       clients time sheet form with the cost of work in hand totalled
  9052.       and sub totalled for each client.
  9053.  
  9054.       Declare output fields
  9055.         Clients.Name:Timesheet.Hrs:Timesheet.Mins:Timesheet.Amount
  9056.         Timesheet.date : Subtotal : Grandtotal
  9057.       end
  9058.       Print Report Header
  9059.       for Clients with name in order
  9060.          Print Group Header
  9061.          Subtotal = 0
  9062.          For Timesheet with Acno = Clients.Acno
  9063.             Subtotal = Subtotal + timesheet.amount
  9064.             Grandtotal = Grandtotal + Timesheet.amount
  9065.             Print List Items
  9066.          next
  9067.          Print Group Footer
  9068.       next
  9069.       Print report footer
  9070.  
  9071.       .......................Output Format.........................
  9072.       .Report Header
  9073.          ═════════════════════════════════════════════════════════
  9074.                    Work in Hand Totalled by Client
  9075.          ═════════════════════════════════════════════════════════
  9076.       .Group Header
  9077.  
  9078.          ██████████████████
  9079.       .List Items
  9080.             ████████      ██Hrs ██Mins                     ██████
  9081.       .Group Footer
  9082.                                                        ──────────
  9083.           Total for ██████████████████                 ██████████
  9084.                                                        ══════════
  9085.       .Report Footer
  9086.          ═════════════════════════════════════════════════════════
  9087.          Total Work In Hand                            ██████████
  9088.          ═════════════════════════════════════════════════════════
  9089.       .end
  9090.  
  9091.       The field in the Group Header is Clients.name
  9092.       The fields in List Items are Timesheet.date, Timesheet.Hrs,
  9093.       Timesheet.Mins and Timesheet.amount.
  9094.       The fields in Group Footer are Clients.name and Subtotal.
  9095.       The field in Report Footer is Grandtotal.
  9096.  
  9097.  
  9098.  
  9099.  
  9100.  
  9101.                                 - 146 -
  9102. ................................................................................
  9103.  
  9104.  
  9105.  
  9106.       UPDATE RECORD          PROCEDURE COMMAND          UPDATE RECORD
  9107.  
  9108.  
  9109.       The "Update record" command is used to alter the contents of
  9110.       one or many records in a form.
  9111.  
  9112.       Ex.
  9113.  
  9114.       for stock with item = input.item
  9115.          stock.price = input.price
  9116.          stock.pricechangedate = system date
  9117.          update record
  9118.       next
  9119.  
  9120.       This example changes the price of a single "Stock" item.
  9121.  
  9122.  
  9123.       for employees with taxcode = input.oldtaxcode
  9124.          employees.taxcode = input.newtaxcode
  9125.          update record
  9126.       next
  9127.  
  9128.       This example changes the taxcode field of all the employees
  9129.       whose present taxcode is the same as the input screen
  9130.       "oldtaxcode" to the input screen "newtaxcode".
  9131.  
  9132.  
  9133.       for employees
  9134.          employees.taxcode = employees.taxcode + 60
  9135.          update record
  9136.       next
  9137.  
  9138.       This example increases the taxcode of all employees by sixty.
  9139.  
  9140.  
  9141.  
  9142.  
  9143.  
  9144.  
  9145.  
  9146.  
  9147.  
  9148.  
  9149.  
  9150.  
  9151.  
  9152.  
  9153.  
  9154.  
  9155.  
  9156.  
  9157.  
  9158.  
  9159.  
  9160.  
  9161.  
  9162.                                 - 147 -
  9163. ................................................................................
  9164.  
  9165.  
  9166.  
  9167.       UPPER                      FUNCTION                       UPPER
  9168.  
  9169.  
  9170.       Returns the Uppercase of a text field or variable.
  9171.  
  9172.       Ex.  Upper(postcode)
  9173.            < shows the postcode field in uppercase>
  9174.  
  9175.       Ex.
  9176.       '.......................
  9177.       declare output fields
  9178.          labelname
  9179.          labeladdress
  9180.          labelcode
  9181.       end
  9182.       for customers with maillist = "yes"
  9183.          Labelname = Upper(customers.name)
  9184.          Labeladdress = Upper(customers.address)
  9185.          Labelcode = customers.postcode
  9186.          print labels
  9187.       next
  9188.  
  9189.       Acceptable parameters:
  9190.  
  9191.       Quoted text
  9192.       Text field/variable
  9193.  
  9194.  
  9195.  
  9196.  
  9197.  
  9198.  
  9199.  
  9200.  
  9201.  
  9202.  
  9203.  
  9204.  
  9205.  
  9206.  
  9207.  
  9208.  
  9209.  
  9210.  
  9211.  
  9212.  
  9213.  
  9214.  
  9215.  
  9216.  
  9217.  
  9218.  
  9219.  
  9220.  
  9221.  
  9222.  
  9223.                                 - 148 -
  9224. ................................................................................
  9225.  
  9226.  
  9227.  
  9228.       V.A.T. FUNCTIONS           FUNCTION            V.A.T. FUNCTIONS
  9229.  
  9230.  
  9231.       Easy Base has a set of five VAT rates which can be altered from
  9232.       the utilities menu. There are four VAT functions:-
  9233.          VATin
  9234.          VATon
  9235.          PlusVAT
  9236.          MinusVAT
  9237.  
  9238.       Ex.   VATin(retailprice,2)
  9239.              < Returns the VAT content of "retailprice" at VAT rate 2
  9240.  
  9241.       Ex.   VATon(netprice,4)
  9242.             < Returns the VAT to be added to "netprice" at VAT rate 4
  9243.  
  9244.       Ex.   PlusVAT(netprice,3)
  9245.             < Returns the VAT inclusive price at VAT rate 3>
  9246.  
  9247.       Ex.   MinusVAT(retailprice,2)
  9248.             < Returns the net price of "retailprice" before VAT at
  9249.               VAT rate 2>
  9250.  
  9251.        (assumes Retailprice as VAT Inclusive and Netprice exclusive)
  9252.  
  9253.       If the second parameter (rate) is omitted from any of the VAT
  9254.       functions then Rate 1 is assumed.
  9255.  
  9256.       Ex.   Gross = PlusVAT(input.net)
  9257.             < The variable "Gross" = the VAT inclusive of the input
  9258.              screen field "net" calculated at rate 1.>
  9259.  
  9260.       Although the VAT functions are primarily included for business
  9261.       applications, they can be used for any purpose where a
  9262.       percentage needs to be changed globally throughout an
  9263.       application without the need to alter each procedure or field
  9264.       derivation in which it is used.
  9265.  
  9266.       Acceptable parameters:
  9267.  
  9268.       1   Any numeric value, field, variable, expression or function
  9269.       2   As Parameter 1 but evaluating between 1 an 5
  9270.  
  9271.  
  9272.  
  9273.  
  9274.  
  9275.  
  9276.  
  9277.  
  9278.  
  9279.  
  9280.  
  9281.  
  9282.  
  9283.  
  9284.                                 - 149 -
  9285. ................................................................................
  9286.  
  9287.  
  9288.  
  9289.       YEAR                       FUNCTION                        YEAR
  9290.  
  9291.  
  9292.       This function returns the year number from a date parameter.
  9293.  
  9294.       Ex.    Year(system date)
  9295.  
  9296.       Ex.
  9297.  
  9298.       Carage = jointext((year(system date)-year(registered))," Years
  9299.       old")
  9300.  
  9301.  
  9302.       Acceptable parameters:
  9303.  
  9304.       System date
  9305.       Date field
  9306.       Makedate function
  9307.       Date expression
  9308.  
  9309.  
  9310.  
  9311.  
  9312.  
  9313.  
  9314.  
  9315.  
  9316.  
  9317.  
  9318.  
  9319.  
  9320.  
  9321.  
  9322.  
  9323.  
  9324.  
  9325.  
  9326.  
  9327.  
  9328.  
  9329.  
  9330.  
  9331.  
  9332.  
  9333.  
  9334.  
  9335.  
  9336.  
  9337.  
  9338.  
  9339.  
  9340.  
  9341.  
  9342.  
  9343.  
  9344.  
  9345.                                 - 150 -
  9346. ................................................................................
  9347.  
  9348.  
  9349.  
  9350.       ZEROPAD                    FUNCTION                     ZEROPAD
  9351.  
  9352.  
  9353.       The Zeropad function pads an integer or fixed point field to a
  9354.       given number of places left and right of the decimal point.
  9355.  
  9356.       Ex.  Zeropad(price,3,2)
  9357.            <Returns "001.50" if price = 1.5>
  9358.  
  9359.       Ex.  Zeropad(acno,6,0)
  9360.            <Returns "004532" if acno = 4,532>
  9361.  
  9362.       The Zeropad function can be used as in the second example to
  9363.       return a fixed length numeric string from an integer field.
  9364.       It's main use, however, is in the creation of fields for
  9365.       compound indices where one of the fields to be compounded is a
  9366.       number.
  9367.  
  9368.       For example: A school has all pupils names and ages recorded on
  9369.       a form in fields "name" and "age". To create an index which
  9370.       will list pupils names alphabetically but grouped by age a
  9371.       compound field which is invisible and does not allow user entry
  9372.       is created as a text field derived with:-
  9373.       Jointext(zeropad(age,2,0),name)
  9374.  
  9375.       Because the compound field is text the index file will be
  9376.       sorted alphabetically. If you sort the numbers 8,9 and 12
  9377.       alphabetically you get 12,8,9 because the one in 12 comes
  9378.       before 8. If however you sort the numbers 08,09 and 12
  9379.       alphabetically you get the correct numeric order.
  9380.  
  9381.       By using the zeropad function in the above example and indexing
  9382.       the compound field,let's call it "unifield" you could then
  9383.       print out the pupils in age groups with the names in each group
  9384.       arranged alphabetically.
  9385.       .........................format.................
  9386.       .group header
  9387.        Pupils aged {pupils.age field}
  9388.       .list items
  9389.               {pupils.name field}
  9390.       .end
  9391.       .........................procedure code.........
  9392.       declare output fields
  9393.          pupils.name:pupils.age
  9394.       end
  9395.       declare variables
  9396.          agecheck as number
  9397.       end
  9398.       agecheck = 0
  9399.       for pupils with unifield in order
  9400.          if pupils.age <> agecheck then print group header
  9401.          agecheck = pupils.age
  9402.          print list items
  9403.       next
  9404.  
  9405.  
  9406.                                 - 151 -
  9407. ................................................................................
  9408.